YUV_NV21_TO_RGB不能正常工作?

时间:2014-01-27 21:08:43

标签: android camera

我正在开发一款监控相机预览的应用程序,并对其进行一些图像处理并在画布上显示int。就像诊断一样,我有以下代码:

camera = Camera.open();

ImageFormat imf = new ImageFormat();
Camera.Parameters param = camera.getParameters();
param.setPreviewSize(128, 128);
preview_format = param.getPreviewFormat();
Camera.Size sz = param.getPreviewSize();

myimage = new int[sz.width*sz.height];

在运行时,它报告preview_format是17,据我所知是“NV21”。

后来我有:

    camera.setPreviewCallback(new PreviewCallback()
    {    
          public void onPreviewFrame(byte[] _data, Camera _camera)
          {
              YUV_NV21_TO_RGB(myimage , _data, 128, 128) ;
          }
    });

YUV_NV21_TO_RGB函数取自here

同时在另一个主题中我有:

    canvas.drawBitmap(
            myimage,        // the int array
            0,              // where to start in the array
            128,            // the stride ???
            200,            // x coord of where to display
            200,            // y coord of where to display
            128,            // wid
            128,            // ht
            false,          // alpha used?
            null);          // the paint used

可以在下面的方块中的其他诊断中看到生成的图像。当我移动手机时,条纹会发生变化,并且在某种程度上与相机所指向的相对应,但很明显它已被破坏。我尝试使用另一个找到here的函数,另一个来自维基百科,但结果看似相同。有什么想法吗?

编辑:有人认为,或许NV21可能无法完全指定格式 - 可能是一类格式,您需要继续并指定每像素或类似的位数。 / p>

编辑:一个额外的线索 - 如果我完全遮住相机,那么这个方块就会变成纯绿色。

Output

1 个答案:

答案 0 :(得分:1)

您的预览尺寸不是128 x 128,因为您无法设置它。您可以在Camera.Parameters实例上进行设置,但不要将其应用于相机。

您需要添加以下行:

camera.setParameters(param);

直接从Camera实例获取参数可能是安全的:

preview_format = camera.getPreviewFormat();
Camera.Size sz = camera.getPreviewSize();