使用Java将BufferedImage转换为OpenCV Mat

时间:2013-08-25 01:47:53

标签: java opencv bufferedimage

我在这里读到的文章表明我正在做的事应该起作用:Converting BufferedImage to Mat in opencv

有人能告诉我为什么我的输出与桌面左上角10x10像素的输出差别很大吗?

编辑:

原始的10x10图像(基本上是eclipse徽标):http://tinypic.com/r/35l5clt/5

加载到Mat:http://tinypic.com/r/af7w90/5

public static void main(String[] args) throws InterruptedException,
        AWTException, IOException {

    byte[] bgrPixelData = ScreenToImage.GetCurrentScreenImage();
    Mat screenFrame = new Mat(10, 10, CvType.CV_8UC3);
    screenFrame.put(0, 0, bgrPixelData);

    // Create a blank output image, that we will draw onto.
    Mat outputFrame = new Mat(screenFrame.size(), CvType.CV_8UC3);

    // Save output and display the openCV Mat image onto the screen.
    ImageToScreen.DrawImageToScreen("c:\\temp\\wtf.png", outputFrame);
}


public class ScreenToImage {

public static byte[] GetCurrentScreenImage() throws AWTException,
        IOException {
    Robot robot = new Robot();
    Dimension d = new Dimension();
    d.height = 10;
    d.width = 10;

    BufferedImage screenShot = robot.createScreenCapture(new Rectangle(d));

    BufferedImage bgrScreenshot = new BufferedImage(screenShot.getWidth(),
            screenShot.getHeight(), BufferedImage.TYPE_3BYTE_BGR);
    boolean done = bgrScreenshot.getGraphics().drawImage(screenShot, 0, 0, null);

    return ((DataBufferByte) bgrScreenshot.getRaster().getDataBuffer())
            .getData();
}
}
static {
    System.loadLibrary("opencv_java246");
}

public class ImageToScreen extends JFrame{

private static final long serialVersionUID = 1L;

public static void DrawImageToScreen(String imgStr, Mat m){
    Highgui.imwrite(imgStr, m);
    JFrame frame = new JFrame("Screen Capture");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setResizable(true);
    frame.setLocationRelativeTo(null);

    ImageIcon image = new ImageIcon(imgStr);
    frame.setSize(image.getIconWidth()+10,image.getIconHeight()+35);
    // Draw the Image data into the BufferedImage
    JLabel label1 = new JLabel(" ", image, JLabel.CENTER);
    frame.getContentPane().add(label1);

    frame.validate();
    frame.setVisible(true);
}
}

1 个答案:

答案 0 :(得分:2)

您正在创建空图像

Mat outputFrame = new Mat(screenFrame.size(), CvType.CV_8UC3);

然后您将其保存到文件并重新读为BufferedImage

Highgui.imwrite(imgStr, m);
ImageIcon image = new ImageIcon(imgStr);

因为该文件包含来自内存的一些随机值。 尝试使用ImageToScreen.DrawImageToScreen对象调用screenFrame,然后就可以了。

您也可以直接从BufferedImage创建Mat(不使用临时文件):

public static BufferedImage createBufferedImage(Mat mat) {
    BufferedImage image = new BufferedImage(mat.width(), mat.height(), BufferedImage.TYPE_3BYTE_BGR);
    WritableRaster raster = image.getRaster();
    DataBufferByte dataBuffer = (DataBufferByte) raster.getDataBuffer();
    byte[] data = dataBuffer.getData();
    mat.get(0, 0, data);
    return image;
}