Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/199.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Android中使用OpenCV将NV21转换为RGB_Java_Android_Opencv - Fatal编程技术网

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

Java 在Android中使用OpenCV将NV21转换为RGB,java,android,opencv,Java,Android,Opencv,我正在尝试在Android中使用OpenCV。所以我首先测试了OpenCV,让两个SurfaceView并排放置。一个SurfaceView用于预览相机的输出(输出格式明显为NV21)。另一个SurfaceView在通过OpenCV后显示相同的预览,如下代码所示: public void onPreviewFrame(byte[] data, Camera camera) { // TODO Auto-generated method stub if( mYuv != null

我正在尝试在Android中使用OpenCV。所以我首先测试了OpenCV,让两个SurfaceView并排放置。一个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();

}

结果是:

好吧,我知道我在哪里乱了套

我最初是这样做的:

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

}

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

在显示之前尝试将RGB转换为RGBA。您似乎错过了每像素额外的bype。@瓦西里谢谢您的提示,但它似乎不起作用。见编辑。它似乎又增加了一个“酒吧”。谢谢!我已经绞尽脑汁好几个小时了!你能发布代码的更多细节吗?我想知道您使用了哪种视图,以及如何访问会员/现场摄像机?