gpt4 book ai didi

java - 在 Java 中将 BufferedImage 转换为 OpenCV Mat

转载 作者:太空宇宙 更新时间:2023-11-03 21:37:24 24 4
gpt4 key购买 nike

我在这里阅读了建议我正在做的事情的文章: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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com