Reputation: 23
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
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