是否可以从CameraPreview抓取一个像素?

时间:2019-02-19 12:28:14

标签: android android-camera android-camera2

我遵循Android Studio教程使CameraPreview正常工作(Camera API Android Developer Guide)。这对我来说很好用,我可以在我的FrameLayout中查看摄像机流。

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

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

如何从Camerapreview像素获取RGB值?

2 个答案:

答案 0 :(得分:0)

如果您使用Camera2 API,则可以在应用程序中实现ImageReader.OnImageAvailableListener类。之后,您将覆盖onImageAvailable函数,该函数将获得一个ImageReader作为参数。然后,您可以访问刚刚用imageReader.acquireNextImage()录制的图像。

答案 1 :(得分:0)

不幸的是,无论使用哪种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

其中包含的代码看起来对于转换是正确的。