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 后生成的图像是绿色的、静态的……东西:

绿色,静态的东西

有任何想法吗?

编辑:

根据评论稍微修改了代码。

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

}

结果是:又是丑陋的绿色东西。

4

1 回答 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();

}

然后一切正常!老实说,这不是我预期的错误所在,所以这不是一个格式正确的问题。

于 2012-07-06T18:41:57.087 回答