2013-05-09 360 views
1

如果我尝试使用Imgproc.cvtColor将相机预览YUV字节数组 转换为RGB(A)字节数组,我得到运行时错误(mYUV_Mat,mRgba_Mat ,Imgproc.COLOR_YUV420sp2RGBA,4) 在onPreviewFrame(字节[]数据,摄像机摄像机):OpenCV for Android:使用Imgproc.cvtColor将相机预览从YUV转换为RGB

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方法 ,因为我可以做本地调用)

回答

6

也许Imgproc库没有被正确地包含在你的项目中,但其他的OpenCV库是?崩溃的行是您使用Imgproc中的方法的第一行,这可以解释代码的前面部分运行正确的原因。

你的代码看起来很好,除了可以使用无参数的构造函数mRgba_Mat(因为大多数OpenCV4Android功能,包括cvtColor,可以推断出目标矩阵所需要的尺寸),并且您分配了大量的空间浪费为mYUV_Mat。你并不需要一个完整的4个通道,如果你只是分配YUV矩阵多出50%的空间比RGB同行:

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

是不是垫构造函数的第一个参数一个高度和第二宽度?国际海事组织的第一个参数是行,其实是一个图像的高度,而不是宽度:P – 2013-11-27 11:03:19

+1

是的,你是对的,参数应该颠倒。我正在调整问题的代码,这也是错误的顺序。 – 2013-11-28 05:21:38

+0

谢谢!但我认为它应该是Mat(高度+高度/ 2,宽度,CvType.CV_8UC1)'(_Height_是第一个参数)。 – 2014-07-21 13:53:27