2016-04-19 44 views
1

この機能を使用してBufferedImageをMatに変換しようとすると、BufferedImageをOpenCVのMatに変換する

public Mat matify(BufferedImage im) { 
// Convert INT to BYTE 
//im = new BufferedImage(im.getWidth(), im.getHeight(),BufferedImage.TYPE_3BYTE_BGR); 
// Convert bufferedimage to byte array 
byte[] pixels = ((DataBufferByte) im.getRaster().getDataBuffer()) 
     .getData(); 

// Create a Matrix the same size of image 
Mat image = new Mat(im.getHeight(), im.getWidth(), CvType.CV_8UC3); 
// Fill Matrix with image values 
image.put(0, 0, pixels); 

return image; 

} 

このエラーが発生します。

Exception in thread "main" java.lang.UnsupportedOperationException: Provided data element number (7955216) should be multiple of the Mat channels count (3) 
at org.opencv.core.Mat.put(Mat.java:2549) 
at Main.matify(Main.java:78) 
at Main.doOpenCV(Main.java:48) 
at Main.main(Main.java:40) 

エラーは、このラインによって

image.put(0,0、画素)に起因します。

なぜこのエラーが発生していますか? JavaでBufferedImageをopencv Matに変換するにはどうすればよいですか?

+0

を働いたものです。あなたの場合、どのタイプの 'im 'が不明です。 – reden

+0

私も同じエラーに直面しています。あなたはこれの解決策を得たのですか? –

答えて

0

これはバッファリングされたイメージは(コメント行のように) `BufferedImage.TYPE_3BYTE_BGR`として宣言されている必要があり、その特定たとえば、私のため

public Mat bufferedImageToMat(BufferedImage bi) { 
    Mat mat = new Mat(bi.getHeight(), bi.getWidth(), CV_8UC(3)); 

    int r, g, b; 
    UByteRawIndexer indexer = mat.createIndexer(); 
    for (int y = 0; y < bi.getHeight(); y++) { 
     for (int x = 0; x < bi.getWidth(); x++) { 
      int rgb = bi.getRGB(x, y); 

      r = (byte) ((rgb >> 0) & 0xFF); 
      g = (byte) ((rgb >> 8) & 0xFF); 
      b = (byte) ((rgb >> 16) & 0xFF); 

      indexer.put(y, x, 0, r); 
      indexer.put(y, x, 1, g); 
      indexer.put(y, x, 2, b); 
     } 
    } 
    indexer.release(); 
    return mat; 
} 
関連する問題