onpreviewcallback 字节数组到 mat opencv

onpreviewcallback byte array to mat opencv

您好,我正在尝试使用 Android 的 PreviewCallback 对捕获的 OnPreviewFrame 帧使用 opencv 执行一些处理。我遇到的问题是在处理之前测试一切正常时,将 byte[] 设置为 Mat 然后将 Mat 设置为位图时,位图看起来像颜色噪声。

mCamera.setPreviewCallback(new Camera.PreviewCallback() {
    @Override
    public void onPreviewFrame(byte[] data, Camera camera) {
    Mat color = new Mat(480,640, CvType.CV_8UC1);
    color.put(0, 0, data);
    Mat imageMat = new Mat(480,640,CvType.CV_8UC1);
    Bitmap bmpOut = Bitmap.createBitmap(color.width(),color.height(),
                                        Bitmap.Config.ARGB_8888);

    Imgproc.cvtColor(color,imageMat, Imgproc.COLOR_YUV420sp2RGBA);

    Utils.matToBitmap(imageMat,bmpOut,true);
    image.setImageBitmap(bmpOut);
}

如有任何帮助,我们将不胜感激!

实际上,Mat 的大小不应该是所选预览的大小。

矩阵的宽度需要比预览尺寸大 1.5 倍,如下所示:

// Copy preview data to a new Mat element 
Mat mYuv = new Mat(frameHeight + frameHeight / 2, frameWidth, CvType.CV_8UC1);
mYuv.put(0, 0, data);

然后,创建位图我通常会这样做:

// Convert preview frame to rgba color space
final Mat mRgba = new Mat();
Imgproc.cvtColor(mYuv, mRgba, Imgproc.COLOR_YUV2BGR_NV12, 4);

// Converts the Mat to a bitmap.
Bitmap bitmap = Bitmap.createBitmap(mRgba.cols(), mRgba.rows(), Bitmap.Config.ARGB_8888);
Utils.matToBitmap(img, bitmap);

matToBitmap方法是实用方法,转换Bitmap比较省力,强烈建议使用,反对自己创建