2017-01-22 164 views
-1

我有一個程序,我試圖捕捉視頻,我可以得到它的工作。我得到的程序工作,但不是我想要的方式,我想要一個RGB濾鏡而不是BRG濾鏡。BufferedImage TYPE_INT_RGB與Mat不兼容?

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) 

我不知道這是什麼意思或是什麼原因造成的。

+0

你能發佈完整的堆棧跟蹤嗎? – mcarlin

+0

我將它添加到帖子@mcarlin – cuber

+0

「我得到了程序工作」:你全部設置! – gpasch

回答

0

堆棧跟蹤告訴你實例化的Mat對象的類型不支持使用int []作爲數據類型的get()調用。如果您在1034行查看the source code,那就是您要調用的方法。它期望您的Mat對象的類型字段爲CvType.CV_32S。我對OpenCV並不熟悉,但是您可以嘗試在構造函數中將Mat對象與CvType.CV_32S作爲類型參數進行實例化,並查看是否可以解決您的問題。