2013-05-09 156 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