从mat到BufferedImage

时间:2015-05-16 13:48:40

标签: java opencv image-processing

我收到错误

  

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

图像以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);
        }
}

1 个答案:

答案 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();
 }