2014-01-14 24 views
9

私はAndroidでOpenCVライブラリを使用しています。私はPictureCallBackを実装するクラスを持っています。以下に示すようにIは画像データが画像を保存し、リロードの代わりに画像処理でさらに使用したいよう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); 
    } 
} 

あります。

Matオブジェクトをバイト配列から取得する最も効率的な方法は何ですか? は、私はすでに、これらのアプローチを試してみました:

  1. は、画像に何が起こったのか分かりません。この場合bitmapToMat() を使用するビットマップに変換

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

  2. 、赤い色が青になります。

私はまた、将来の使用のために画像を保存するには問題ありませんが、私が以前に保存された画像を使用していたときに、ファイルは、まだ生成されていないので、これは私に例外をリードしています。

答えて

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 [] '配列です。それは、例えば、 – 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フォーマットです。

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

関連する問題