如果我嘗試使用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方法 ,因爲我可以做本地調用)
是不是墊構造函數的第一個參數一個高度和第二寬度?國際海事組織的第一個參數是行,其實是一個圖像的高度,而不是寬度:P – 2013-11-27 11:03:19
是的,你是對的,參數應該顛倒。我正在調整問題的代碼,這也是錯誤的順序。 – 2013-11-28 05:21:38
謝謝!但我認爲它應該是Mat(高度+高度/ 2,寬度,CvType.CV_8UC1)'(_Height_是第一個參數)。 – 2014-07-21 13:53:27