我在这里读到的文章表明我正在做的事应该起作用: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);
}
}
答案 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;
}