首页 > 解决方案 > 是否可以从 CameraPreview 中抓取一个像素?

问题描述

我按照 Android Studio 教程让 CameraPreview 工作(Camera API Android Developer Guide)。这对我来说很好,我可以在我的 FrameLayout 中查看相机流。

但我想在每次更改时从预览中的特定像素获取 RGB 值。我没有找到将 previewImage 作为位图提供的方法,并且无法理解该onPreviewFrame方法的用法

@Override public void onPreviewFrame(byte[] data, Camera camera) {}

如何从 Camerapreview Pixel 获取 RGB 值?

标签: androidandroid-cameraandroid-camera2

解决方案


不幸的是,使用任一 API,您都需要自己处理 YUV 数据。

相机设备本身会生成 YUV 数据,而不是 RGB,因此 API 不会花费额外资源来自动转换数据。主要的简单例外是将数据管道传输到 GPU,GPU 驱动程序会在像素着色器中为您自动将 YUV 转换为 RGB。

但是,如果您只是在常规应用程序代码中,则需要解析数据。

对于已弃用的 android.hardware.Camera API,默认输出为 NV21,您通常可以选择 YV12 作为另一个选项。

维基百科上关于 YUV 的文章比较有帮助:https ://en.wikipedia.org/wiki/YUV

但是对于 YUV->RGB 转换它确实有错误的转换系数;他们应该是:

R = Y + 1.402 (Cr-128)
G = Y - 0.34414 (Cb-128) - 0.71414 (Cr-128)
B = Y + 1.772 (Cb-128)

(Cb = U, Cr = V)

你也可以看看这个stackoverflow帖子: Extract black and white image from android camera's NV21 format

它的代码看起来对转换是正确的。


推荐阅读