2014-01-14 84 views
9

我正在使用Android中的OpenCV庫。我有一個實施PictureCallBack的課程。如何從openCV android中的Byte []獲取Mat對象?

覆蓋方法onPictureTaken()是如下面給出的,

 @Override 
public void onPictureTaken(byte[] data, Camera camera) { 
    Log.i(TAG, "Saving a bitmap to file"); 
    // The camera preview was automatically stopped. Start it again. 
    mCamera.startPreview(); 
    mCamera.setPreviewCallback(this); 

    // Write the image in a file (in jpeg format) 
    try { 
     FileOutputStream fos = new FileOutputStream(mPictureFileName); 
     fos.write(data); 
     fos.close(); 

    } catch (java.io.IOException e) { 
     Log.e("PictureDemo", "Exception in photoCallback", e); 
    } 
} 

正如我想圖像數據,以在保存和重新加載圖像的代替來在圖像處理進一步使用。

從Byte數組中獲取Mat對象的最有效方法是什麼? 我已經試過這些方法:

  1. 不知道圖像發生了什麼。

    Mat m=new Mat(); m.put(0,0,data);

  2. 轉換爲位圖,則使用bitmapToMat() 在這種情況下,紅色變成藍色。

我也沒有拯救以備將來使用圖像的任何問題,但是這將導致我,因爲尚未生成的文件然而,當我使用的是先前存儲的圖像異常。

回答

13

您必須指定圖像/墊子和通道深度的寬度和高度。

Mat mat = new Mat(width, height, CvType.CV_8UC3); 
mat.put(0, 0, data); 

確保您使用的是正確類型的墊子。也許你的數據不是3字節的RGB格式,你應該使用另一種類型,例如CvType.CV_8UC1
祝你好運!

+0

這應該是一個正確 –

+0

可以請你定義的數據?這是什麼? –

+0

'data'是'byte []'數組,其中包含適當格式的一系列像素。它可以從例如。 ''BufferedImage' - 'byte [] data =((DataBufferByte)image.getRaster()。getDataBuffer())。getData();' – lukk

1

opencv有一個很好的方式來將Mats寫入文件 - 它可以根據提供的文件擴展名生成不同的格式。下面是一個小例子:

public void writeImageToFile(Mat image, String filename) { 

    File root = Environment.getExternalStorageDirectory(); 
    File file = new File(root, filename); 

    Highgui.imwrite(file.getAbsolutePath(), image); 

    if (DEBUG) 
     Log.d(TAG, 
       "writing: " + file.getAbsolutePath() + " (" + image.width() 
         + ", " + image.height() + ")"); 
} 

如果紅色和藍色被換那麼它聽起來像是onPictureTaken您的字節數據()是BGRA格式。您可以使用它來交換RGBA:

Imgproc.cvtColor(bgrImg, rgbImg, Imgproc.COLOR_BGR2RGB); 

該格式實際上是設備特定的 - 在一個設備上,我通過它作爲YUV。

9

最好的和最簡單的方法是這樣的:

byte[] bytes = FileUtils.readFileToByteArray(new File("aaa.jpg")); 
Mat mat = Imgcodecs.imdecode(new MatOfByte(bytes), Imgcodecs.CV_LOAD_IMAGE_UNCHANGED); 
+0

我看到這個粘貼了很多類似的問題,但它導致崩潰記憶。看起來這可能不是一個可行的解決方案,當你有一個大於預期的Mat輸出的圖像。 – LoungeKatt