java - Java 中的 BufferedImage 到 OpenCV Mat 中

标签 java opencv bufferedimage

我已阅读此处的文章,该文章表明我正在做的事情应该有效: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/

相关文章:

java - Flink 在 timeWindow 上应用函数

java - 无法调用 "UserRepository.findAll()",因为 "userRepository"为空

android - Android 与 OpenCV 3.4.0 和 NDK 的链接错误

image - 上传图片生成特效视频

java - BufferedImage 到 BufferedImage 数组,图 block 消失

Java ASM 字节码 - 查找属于特定方法调用的所有指令

java - 在 JAVA 中创建 Web 服务客户端以从 WSDL (w.Eclipse) 访问方法

python - 使用opencv用另一个填充空白图像

java - 在 J2ME 中使用 BufferedImage

java - BufferedImages 数组错误?