2016-04-22 15 views
5

私は、画像が撮影されるとすぐに、つまりonPictureTaken()コールバックで画像を処理しようとしていました。バイト配列をOpenCV行列に変換する必要がありますが、私がしようとするとアプリケーション全体がフリーズします。それはそれを解決する方法をフリーズすると、なぜOpenCV onPictureTakenで画像を処理するには?

@Override 
public void onPictureTaken(byte[] bytes, Camera camera) { 
    Log.w(TAG, "picture taken!"); 

    if (bytes != null) { 
     Bitmap image = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); 
     Mat matImage = new Mat(); 

     // This is where my app freezes. 
     Utils.bitmapToMat(image, matImage); 

     Log.w(TAG, matImage.dump()); 
    } 

    mCamera.startPreview(); 
    mCamera.setPreviewCallback(this); 
} 

、誰もが知っています:基本的に私がしたすべては、このでしたか?

注:私はOpenCV4Androidチュートリアル3をベースとして使用しました。

アップデート1:私はまた、次のように(任意の成功なし)バイトをparsteしようとしました:

Mat mat = Imgcodecs.imdecode(
    new MatOfByte(bytes), 
    Imgcodecs.CV_LOAD_IMAGE_UNCHANGED 
); 

アップデート2:たぶんこれは動作するはずです、それはしかし、私のためではありませんでした。

Mat mat = new Mat(1, bytes.length, CvType.CV_8UC3); 
mat.put(0, 0, bytes); 

もこの変形ました:

Bitmap image = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); 
Mat mat = new Mat(image.getHeight(), image.getWidth(), CvType.CV_8UC1); 
mat.put(0, 0, bytes); 

はアップデート3:これはどちらか私のために動作しませんでした:

Mat mat = new MatOfByte(bytes); 

答えて

0

私は私の同僚のいくつかの助けを持っています。

BitmapFactory.Options opts = new BitmapFactory.Options(); // This was missing. 
Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length, opts); 

Mat mat = new Mat(); 
Utils.bitmapToMat(bitmap, mat); 

// Note: when the matrix is to large mat.dump() might also freeze your app. 
Log.w(TAG, mat.size()); 

うまくいけば、これもこれで苦労している人、あなたのすべてをお手伝いします:彼は、次の操作を行って問題を解決するために管理しました。