我按照Android Studio教程获得了CameraPreview to work (Camera API Android Developer Guide)。这对我来说很好,我可以在我的FrameLayout中查看摄像头流。
但我想在每次更改时从预览中的特定像素获得RGB值。我找不到将previewImage转换为位图的方法,也不能理解onPreviewFrame方法的用法
@Override public void onPreviewFrame(byte[] data, Camera camera) {}
如何从Camerapreview像素获取RGB值?
发布于 2019-02-21 01:16:35
如果您使用的是Camera2应用程序接口,则可以在应用程序中实现ImageReader.OnImageAvailableListener类。在此之后,您将覆盖onImageAvailable函数,该函数获取一个ImageReader作为参数。然后,您就可以访问刚刚用imageReader.acquireNextImage()录制的图像。
发布于 2019-02-21 05:38:34
不幸的是,无论使用哪种API,您都需要自己处理YUV数据。
相机设备本身就会生成YUV数据,而不是RGB,因此API不会花费额外的资源来自动转换数据。主要的简单例外是将数据输送到GPU,其中GPU驱动程序会在像素着色器中为您自动将YUV转换为RGB。
但是,如果您只是在编写常规应用程序代码,则需要解析数据。
对于不推荐使用的android.hardware.Camera接口,默认情况下输出为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
它的代码看起来对转换是正确的。
https://stackoverflow.com/questions/54766370
复制相似问题