如何使用OpenCV onPictureTaken处理图像?

时间:2016-04-22 12:46:02

标签: android opencv opencv3.1

我一直试图在拍摄照片时处理图像,即在onPictureTaken()回调中。根据我的理解,我应该将字节数组转换为OpenCV矩阵,但是当我尝试这样做时,整个应用程序会冻结。基本上我所做的就是这个:

@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:我还试图解析字节(没有任何成功),如下所示:

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);

1 个答案:

答案 0 :(得分:1)

我得到了我同事的帮助。他设法通过以下方式解决问题:

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()); 

希望这会帮助所有正在努力解决这个问题的人。