onpreviewcallback字节数组到mat opencv

时间:2015-08-14 18:55:59

标签: android opencv bitmap bytearray mat

您好我尝试使用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);
}

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:2)

实际上,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时节省了大量精力,因此我强烈建议您将其用作自己创建的对象。