2012-07-04 165 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