我已阅读此处的文章,该文章表明我正在做的事情应该有效:Converting BufferedImage to Mat in opencv
谁能告诉我为什么我的输出与桌面左上角 10x10 像素的输出有如此大的不同?
编辑:
原始 10x10 图像(基本上是 Eclipse Logo ):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);
}
}
最佳答案
您正在创建空图像
Mat outputFrame = new Mat(screenFrame.size(), CvType.CV_8UC3);
然后将其保存到文件并重新读取为 BufferedImage
Highgui.imwrite(imgStr, m);
ImageIcon image = new ImageIcon(imgStr);
因为该文件包含内存中的一些随机值。
尝试使用 screenFrame
对象调用 ImageToScreen.DrawImageToScreen
,它应该可以工作。
您还可以直接从 Mat
创建 BufferedImage
(不使用临时文件):
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;
}
关于java - Java 中的 BufferedImage 到 OpenCV Mat 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18424892/