Java 从mat到BuffereImage的OpenCV图像转换
我犯了一个错误 无法对非静态方法进行静态引用 图像以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; } }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
该错误意味着您正在对未声明为静态的方法进行静态引用。例如,考虑这个代码:
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();
}