optional
optional

Reputation: 23

BufferedImage into OpenCV Mat in Java

I've read the article here that suggests what I'm doing should work: Converting BufferedImage to Mat in opencv

Can anyone tell me why my output is so dramatically different than what's in the top left 10x10 pixels on my desktop?

edit:

original 10x10 image (eclipse logo basically): http://tinypic.com/r/35l5clt/5

after loading into 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);
}
}

Upvotes: 2

Views: 3940

Answers (1)

lukk
lukk

Reputation: 3234

You are creating empty image

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

Then you are saving it to file and re-read as BufferedImage

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

Because of that the file contains some random values from memory. Try to call ImageToScreen.DrawImageToScreen with screenFrame object and it shoud work.

Also you can create BufferedImage directly from Mat (without using temporary file):

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;
}

Upvotes: 2

Related Questions