2012-07-04 139 views
4

我正嘗試在Android中使用OpenCV。所以我首先通過將兩個SurfaceView並排放置來測試OpenCV。一個SurfaceView用於從相機預覽輸出(輸出格式顯然是NV21)。其他SurfaceView表示通過後的OpenCV相同的預覽如下圖所示的代碼:在Android中使用OpenCV將NV21轉換爲RGB

public void onPreviewFrame(byte[] data, Camera camera) { 
    // TODO Auto-generated method stub 

    if(mYuv != null) mYuv.release(); 
    mYuv = new Mat(height + height/2, width, CvType.CV_8UC1); 
    mYuv.put(0, 0, data); 
    Mat mRgba = new Mat(); 

    Imgproc.cvtColor(mYuv, mRgba, Imgproc.COLOR_YUV2RGB_NV21, 4); 

    Bitmap map = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 

    Utils.matToBitmap(mRgba, map); 

    preview.setBackgroundDrawable(new BitmapDrawable(map)); 
    mRgba.release(); 

} 

但通過OpenCV的後所產生的圖像是綠色的,staticy ......事情:

green, staticy thing

任何想法?

編輯:

根據評論修改了一下代碼。

public void onPreviewFrame(byte[] data, Camera camera) { 
    // TODO Auto-generated method stub 

    if(mYuv != null) mYuv.release(); 
    mYuv = new Mat(height + height/2, width, CvType.CV_8UC1); 
    mYuv.put(0, 0, data); 
    Mat mRgba = new Mat(); 

    Imgproc.cvtColor(mYuv, mRgba, Imgproc.COLOR_YUV2RGBA_NV21, 4); 

    Bitmap map = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 

    Utils.matToBitmap(mRgba, map); 

    preview.setBackgroundDrawable(new BitmapDrawable(where.getResources(), map)); 
    mRgba.release(); 

} 

導致此:Ugly green thing again.

+0

嘗試在顯示前將RGB轉換爲RGBA。看起來你似乎錯過了每像素的額外範圍。 – Sam

+0

@vasile感謝您的提示,但它似乎不工作。見編輯。它似乎又增加了一個'酒吧'。 – vsector

回答

7

好吧,我想通了,我失控了。

我最初做了這樣的事情:

public void surfaceChanged(SurfaceHolder holder, int format, int width, 
     int height) { 

    this.width = width; this.height = height; 
    params.setPreviewSize(width, height); 
    camera.setParameters(params); 
    camera.startPreview(); 

} 

的問題是,Android上的相機只支持特定的預覽分辨率。因此,我設定的具體決議無效。所以,我把它改爲:

public void surfaceChanged(SurfaceHolder holder, int format, int width, 
     int height) { 

    Size size = params.getPreviewSize(); 
    this.height = size.height; 
    this.width = size.width; 
    camera.setParameters(params); 
    camera.startPreview(); 

} 

然後一切正常!老實說,這不是我預期的錯誤所在,所以這不是一個很好的問題。

+0

謝謝! 我一直在打破我的頭幾個小時! –

+0

你能發表您的問題的更多詳細信息?我想知道您使用了哪個視圖以及您如何訪問會員/現場攝像機? – Matthias