在Android中使用OpenCV将NV21转换为RGB

6

我正在尝试在Android中使用OpenCV。因此,我首先通过将两个SurfaceView并排放置来测试OpenCV。其中一个SurfaceView用于预览从相机输出的图像(输出格式明显为NV21)。另一个SurfaceView在通过OpenCV后显示相同的预览,如下面的代码所示:

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处理后的图像是一个绿色、有静态的...东西:

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();

}

这导致了这个结果:丑陋的绿色物体又来了。

在显示之前尝试将 RGB 转换为 RGBA。看起来你错过了每个像素的额外字节。 - Sam
@vasile 感谢您的提示,但似乎不起作用。请参见编辑后的内容。它似乎添加了一个额外的“bar”。 - vsector
1个回答

8

好的,我找到了自己出了什么问题。

最初我做了这样的事情:

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();

}

然后一切都正常工作!老实说,我没有预料到错误会出现在这里,所以这不是一个清晰的问题。


谢谢!我已经苦思冥想了几个小时! - Asaf Pinhassi
你能发布一下代码的更多细节吗?我想知道你使用了哪个视图以及如何访问成员/字段相机? - Matthias

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接