OpenCV for Android:使用Imgproc.cvtColor将相机预览从YUV转换为RGB

时间:2013-05-09 22:03:29

标签: android opencv converter rgb yuv

如果我尝试转换相机预览YUV字节数组,则会出现运行时错误 到Imgproc.cvtColor的RGB(A)字节数组(mYUV_Mat,mRgba_Mat,Imgproc.COLOR_YUV420sp2RGBA,4) 在onPreviewFrame(byte []数据,相机相机):

Preview.java:

     mCamera.setPreviewCallback(new PreviewCallback() {
          public void onPreviewFrame(byte[] data, Camera camera)
          {
            // Pass YUV data to draw-on-top companion
            System.arraycopy(data, 0, mDrawOnTop.mYUVData, 0, data.length);
            mDrawOnTop.invalidate();
          }
       });

DrawOnTop.java:

public class DrawOnTop extends View {
Bitmap mBitmap;
Mat mYUV_Mat;
protected void onDraw(Canvas canvas) {
    if (mBitmap != null)
    {

        canvasWidth = canvas.getWidth();
        canvasHeight = canvas.getHeight();
        int newImageWidth = 640;
        int newImageHeight = 480;
        marginWidth = (canvasWidth - newImageWidth)/2;

        if( mYUV_Mat != null ) mYUV_Mat.release();

        //mYUV_Mat = new Mat( newImageWidth, newImageHeight, CvType.CV_8UC1 );
        mYUV_Mat = new Mat( newImageWidth, newImageHeight, CvType.CV_8UC4 );
        mYUV_Mat.put( 0, 0, mYUVData );

        //Mat mRgba_Mat = new Mat();
        Mat mRgba_Mat = new Mat(newImageWidth,newImageHeight,CvType.CV_8UC4);

        //Mat mRgba_Mat = mYUV_Mat;

        //Imgproc.cvtColor( mYUV_Mat, mRgba_Mat, Imgproc.COLOR_YUV2RGBA_NV21, 4 );
        //Imgproc.cvtColor( mYUV_Mat, mRgba_Mat, Imgproc.COLOR_YUV420sp2RGB, 4 );
        Imgproc.cvtColor( mYUV_Mat, mRgba_Mat, Imgproc.COLOR_YUV420sp2RGBA, 4 );


        // Draw Bitmap New:
        Bitmap mBitmap = Bitmap.createBitmap( newImageWidth, newImageHeight, Bitmap.Config.ARGB_8888 );
        Utils.matToBitmap( mRgba_Mat, mBitmap );
        mRgba_Mat.release();
}
}

转换mYUV_Mat.put(0,0,mYUVData)正确运行。 但尝试使用Imgproc.cvtColor将mYUV_Mat转换为mRgb_Mat 导致所有运行时错误(“找不到源”。使用Eclipse)。

我目标的正确Imgproc.cvtColor命令是什么?

(我不想使用Java YUV2RGB(A)解码方法,因为它会变慢 用于图像处理。我想使用OpenCV Imgproc.cvtColor方法 因为我可以做本地电话)

1 个答案:

答案 0 :(得分:6)

也许Imgproc库未正确包含在您的项目中,但其他OpenCV库是?崩溃的行是您使用Imgproc中的方法的第一行,这可以解释为什么代码的早期部分正确运行。

你的代码看起来很好,除了你可以使用mRgba_Mat的无参数构造函数(因为大多数OpenCV4Android函数,包括cvtColor,可以推断出目标矩阵所需的大小),而你&# 39;为mYUV_Mat重新分配大量浪费的空间。如果你只是为YUV矩阵分配比RGB对应物多50%的空间,你就不需要一个完整的4个通道:

mYUV_Mat = new Mat( newImageHeight + newImageHeight / 2, newImageWidth, CvType.CV_8UC1 );