我收到错误
无法对非静态方法进行静态引用
图像以mat类型加载,然后转换为BufferedImage进行显示。 在一些OpenCV函数之间将使用。主要的转换器由于错误mag而无法运行。错误是什么?
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.lang.Math;
import org.opencv.core.Mat;
import org.opencv.highgui.Highgui;
public class Tutorial1 {
public static void main(String[] args){
converter();
}
public void converter(){
Mat matImage= Highgui.imread(getClass().getResource("/lena.png").getPath());
BufferedImage bufImage = Mat2BufferedImage(matImage);
displayImage(bufImage);
}
public BufferedImage Mat2BufferedImage(Mat m){
//source: http://answers.opencv.org/question/10344/opencv-java-load-image-to-gui/
//Fastest code
//The output can be assigned either to a BufferedImage or to an Image
int type = BufferedImage.TYPE_BYTE_GRAY;
if ( m.channels() > 1 ) {
type = BufferedImage.TYPE_3BYTE_BGR;
}
int bufferSize = m.channels()*m.cols()*m.rows();
byte [] b = new byte[bufferSize];
m.get(0,0,b); // get all the pixels
BufferedImage image = new BufferedImage(m.cols(),m.rows(), type);
final byte[] targetPixels = ((DataBufferByte) image.getRaster().getDataBuffer()).getData();
System.arraycopy(b, 0, targetPixels, 0, b.length);
return image;
}
public void displayImage(Image img2)
{
//BufferedImage img=ImageIO.read(new File("/HelloOpenCV/lena.png"));
ImageIcon icon=new ImageIcon(img2);
JFrame frame=new JFrame();
frame.setLayout(new FlowLayout());
frame.setSize(img2.getWidth(null)+50, img2.getHeight(null)+50);
JLabel lbl=new JLabel();
lbl.setIcon(icon);
frame.add(lbl);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
答案 0 :(得分:0)
该错误意味着您正在对未声明为static的方法进行静态引用。例如,请考虑以下代码:
class Example{
public void doSomething(){
...
}
public static void main(String[] args){
doSomething();
}
}
在这里,您可以看到从main方法内部到非静态方法doSomething()
的静态引用,这将产生您现在获得的相同错误。
现在解决方案: 要解决此问题,您可以将static关键字添加到相关方法中。因此,对于我的例子,这意味着我将改变我的方法:
public void doSomething(){
}
要:
public static void doSomething(){
}
另一个选择是使用该方法创建类的新实例,然后调用它。这将是这样做的(使用我的例子)。
class Example{
public void doSomething(){
...
}
public static void main(String[] args){
Example example = new Example();
example.doSomething();
}
}
这两种解决方案都可以解决问题,但程序员需要确定哪种方式更适合这种情况。
所以问题的解决方案,你的JDK应该用红色下划线以错误的方式告诉你使用什么方法。然后你只需要应用两种解决方案中的一种。
我希望这会有所帮助:)
编辑#1:
在你的情况下,你是从main方法调用转换器,但转换器不是静态的,因此会抛出错误。
编辑#2:
因此,要在您的情况下解决它,您可以将主要方法更改为:
public static void main(String[] args){
new Tutorial1().converter();
}