java - 将屏幕截图加载到 Mat

标签 java opencv bufferedimage mat

我正在使用机器人捕捉屏幕截图。为了避免将 BufferedImage 写入磁盘然后将其重新加载到 Mat 中的不必要的 I/O,我尝试使用以下代码将 BufferedImage 直接加载到 Mat 中。

public static Mat screenShot() throws AWTException, IOException {

    Robot r = new Robot();      
    Rectangle capture =  new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()); 
    BufferedImage Image = r.createScreenCapture(capture); 
    Mat mat = new Mat(Image.getHeight(), Image.getWidth(), CvType.CV_8UC1);     
    byte[] data = ((DataBufferByte) Image.getRaster().getDataBuffer()).getData();
    mat.put(0, 0, data);
    return mat;

}

我收到这个错误:

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.awt.image.DataBufferInt cannot be cast to java.awt.image.DataBufferByte

我该如何规避这个问题?

最佳答案

我在 this 上找到了解决方法线程,紫外线的响应处理该问题。

工作代码:

public static Mat screenShot() throws AWTException, IOException {

    Robot r = new Robot();      
    Rectangle capture =  new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()); 
    BufferedImage Image = r.createScreenCapture(capture);       
    Mat mat = BufferedImage2Mat(Image);

    return mat;

}

public static Mat BufferedImage2Mat(BufferedImage image) throws IOException {

    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    ImageIO.write(image, "jpg", byteArrayOutputStream);
    byteArrayOutputStream.flush();
    return Imgcodecs.imdecode(new MatOfByte(byteArrayOutputStream.toByteArray()), Imgcodecs.CV_LOAD_IMAGE_UNCHANGED);

}

关于java - 将屏幕截图加载到 Mat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53239237/

相关文章:

python - opencv-python 中的 imshow 不起作用

opencv - 哪些计算机视觉库和算法可用于人类行为分析?

java - 从不可见的 AWT 组件创建图像?

opencv - PyLint 不识别 cv2 成员

java - 缓冲图像 INT/4BYTE/USHORT

java.awt.image.BufferedImage.getRBG 未返回预期值

java - 如何在Libgdx中在屏幕上实现ZoomIn ZoomOut的效果

java split regex - 任意字符组合

java - 如何在 2 个 TextView 自定义数组上使用 OnClickListener

c# - 将许多矩形组合成更少的矩形