Java 从mat到BuffereImage的OpenCV图像转换

Java 从mat到BuffereImage的OpenCV图像转换,java,opencv,image-processing,Java,Opencv,Image Processing,我犯了一个错误 无法对非静态方法进行静态引用 图像以mat类型加载,然后转换为BuffereImage进行显示。 在这两者之间,将使用一些OpenCV函数。由于mag错误,main中的转换器无法运行。错误是什么 导入java.awt.*; 导入java.awt.event.*; 导入javax.swing.*; 导入java.awt.image.buffereImage; 导入java.awt.image.DataBufferByte; 导入java.lang.Math; 导入org.openc

我犯了一个错误

无法对非静态方法进行静态引用

图像以mat类型加载,然后转换为BuffereImage进行显示。 在这两者之间,将使用一些OpenCV函数。由于mag错误,main中的转换器无法运行。错误是什么

导入java.awt.*; 导入java.awt.event.*; 导入javax.swing.*; 导入java.awt.image.buffereImage; 导入java.awt.image.DataBufferByte; 导入java.lang.Math; 导入org.opencv.core.Mat; 导入org.opencv.highgui.highgui; 公共课辅导1{ 公共静态无效字符串[]args{ 转换器; } 公共真空转换器{ Mat matImage=Highgui.imreadgetClass.getResource/lena.png.getPath; buffereImage bufImage=mat2bufferedimageatimage; 显示图像bufimage; } 公共缓冲区映像MAT2BUFFEREDIMAGEAT m{ //资料来源:http://answers.opencv.org/question/10344/opencv-java-load-image-to-gui/ //最快代码 //可以将输出分配给BuffereImage或映像 int type=BufferedImage.type\u BYTE\u GRAY; 如果m.channels>1{ type=buffereImage.type\u 3BYTE\u BGR; } int bufferSize=m.channels*m.cols*m.rows; 字节[]b=新字节[bufferSize]; m、 get0,0,b;//获取所有像素 BuffereImage image=新的BuffereImage.cols,m.rows,type; 最终字节[]targetPixels=DataBufferByte image.getRaster.getDataBuffer.getData; System.arraycopyb,0,targetPixels,0,b.长度; 返回图像; } 公共空白显示图像img2 { //BufferedImage img=ImageIO.readnew文件/HelloOpenCV/lena.png; ImageIcon图标=新的ImageIconimg2; JFrame frame=新JFrame; frame.setLayout新建FlowLayout; frame.setSizeMg2.getWidthnull+50,img2.getHeightnull+50; JLabel lbl=新的JLabel; lbl.setIconicon; frame.addlbl; frame.setVisibletrue; frame.setDefaultCloseOperationJFrame.EXIT_ON_CLOSE; } }
该错误意味着您正在对未声明为静态的方法进行静态引用。例如,考虑这个代码:

class Example{
    public void doSomething(){
         ...
    }

    public static void main(String[] args){
        doSomething();
    }
}
这里你可以看到一个静态引用是从main方法内部引用到非静态方法doSomething,这将产生与你现在得到的相同的错误

那么现在来看看解决方案: 要解决此问题,您可以将static关键字添加到有问题的方法中。因此,对于我的示例,这意味着我将改变我的方法,从:

public void doSomething(){

}
致:

另一个选项是使用该方法创建类的新实例,然后调用它。使用我的例子,可以这样做

class Example{
    public void doSomething(){
        ...
    }

    public static void main(String[] args){
        Example example = new Example();
        example.doSomething();
    }
}
这两种解决方案都可以解决问题,但由程序员决定哪种方法更适合这种情况

因此,要解决您的问题,您的JDK应该用红色下划线告诉您尝试以错误方式使用的方法。然后你只需要应用两种解决方案中的一种

我希望这有助于:

编辑1:

在本例中,您是从主方法调用转换器,但转换器不是静态的,因此会抛出错误

编辑2:

因此,要解决您的问题,您可以将主要方法更改为:

 public static void main(String[] args){
     new Tutorial1().converter();
 }

谢谢你的解释of@Brunts没问题祝你的项目顺利完成:
 public static void main(String[] args){
     new Tutorial1().converter();
 }