BufferedImage TYPE_INT_RGB与Mat不兼容?

时间:2017-01-22 22:20:35

标签: java opencv

我有一个程序,我正在尝试捕获视频,我可以让它工作。我让程序工作但不是我想要的方式,我想要一个RGB滤镜而不是BRG滤镜。

byte [] dat;
if (dat == null || dat.length != w * h * 3)
        dat = new byte [w * h * 3];
    if (img == null || img.getWidth() != w || img.getHeight() != h || img.getType() != BufferedImage.TYPE_3BYTE_BGR)
        img = new BufferedImage(w, h, BufferedImage.TYPE_3BYTE_BGR);

相机正在加载,但我想要一个RGB过滤器。这就是我试图获取RGB过滤器所以我将代码更改为此。

import org.opencv.core.Core;
import org.opencv.core.Mat;

public class Mat2Image {
    Mat mat = new Mat();
    BufferedImage img;
    int[] dat;

    Mat2Image(){
    }

    public Mat2Image(Mat mat) {
        getSpace(mat);
    }

    public void getSpace(Mat mat) {
        this.mat = mat;
        int w = mat.cols(), h = mat.rows();
        if (dat == null || dat.length != w * h)
            dat = new int[w * h];
        if (img == null || img.getWidth() != w || img.getHeight() != h || img.getType() != BufferedImage.TYPE_INT_RGB)
            img = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
    }

    BufferedImage getImage(Mat mat) {
        getSpace(mat);
        mat.get(0, 0, dat);
        img.getRaster().setDataElements(0, 0, mat.cols(), mat.rows(), dat);
        return img;
    }
    static {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    }
}

当我运行程序时,它会抛出异常。

Exception in thread "AWT-EventQueue-0" java.lang.UnsupportedOperationException: Mat data type is not compatible: 16
at org.opencv.core.Mat.get(Mat.java:1045)
at Mat2Image.getImage(Mat2Image.java:44)
at VideoCap.getOneFrame(VideoCap.java:33)
at MyFrame.paint(MyFrame.java:39)
at javax.swing.RepaintManager$4.run(RepaintManager.java:842)
at javax.swing.RepaintManager$4.run(RepaintManager.java:814)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:814)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:789)
at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:738)
at javax.swing.RepaintManager.access$1200(RepaintManager.java:64)
at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1732)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:726)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

我不知道这意味着什么或导致它的原因。

1 个答案:

答案 0 :(得分:0)

该堆栈跟踪告诉您实例化的Mat对象的类型不支持使用int []作为数据类型的get()调用。如果您在第1034行查看the source code,那就是您正在调用的方法。它希望您的Mat对象的类型字段为CvType.CV_32S。我不熟悉OpenCV,但您可以尝试使用Mat作为构造函数中的类型参数来实例化CvType.CV_32S对象,看看是否能解决您的问题。