android - YUV_NV21_TO_RGB 不工作?

标签 android camera

我正着手开发一个应用程序来监视相机预览,对其进行一些图像处理并在 Canvas 上显示 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

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

编辑:我的一个想法是 NV21 可能没有完全指定格式 - 也许它是一类格式,您需要继续指定每像素位数或类似格式。

编辑: 一条额外的线索 - 如果我完全遮住相机,正方形就会变成纯绿色。

Output

最佳答案

您的预览尺寸不是 128 x 128,因为您设置失败。您在 Camera.Parameters 实例上设置了它,但没有将它应用到相机。

您需要添加以下行:

camera.setParameters(param);

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

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

关于android - YUV_NV21_TO_RGB 不工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21391700/

相关文章:

python - 使用 Aruco 标记获取相机位置和旋转

android - 定义布局内容区域

android - 获取相机当前图片文件夹

ios - AVFoundation人脸检测框架

java - 连接相机时出错: 0 --- Fail to connect to camera service

java - 为什么尝试将 SurfaceView 与相机关联时抛出 `UnsupportedOperationException` ?

Android:使用 .sqlite 扩展名访问 Assets 文件夹 sqlite 数据库文件

Android 谷歌地图 V2 截图

Android:根据用户设置以编程方式更改 SourceSet

c++ - 从 QThread 使用 QCamera/QCameraInfo