android - 是否可以从 CameraPreview 中抓取一个像素?
问题描述
我按照 Android Studio 教程让 CameraPreview 工作(Camera API Android Developer Guide)。这对我来说很好,我可以在我的 FrameLayout 中查看相机流。
但我想在每次更改时从预览中的特定像素获取 RGB 值。我没有找到将 previewImage 作为位图提供的方法,并且无法理解该onPreviewFrame
方法的用法
@Override
public void onPreviewFrame(byte[] data, Camera camera) {}
如何从 Camerapreview Pixel 获取 RGB 值?
解决方案
不幸的是,使用任一 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
它的代码看起来对转换是正确的。
推荐阅读
- javascript - 使用节点 JS 向 MongoDB 添加数据,我收到此错误:“TypeError: Cannot read property 'username' of undefined”
- html - 我的按钮内的文本在多行中垂直而不是水平,我如何将它写在一行中?
- tensorflow-federated - TFF:将客户端拆分为训练和测试或将每个客户端数据集拆分为训练和测试之间的区别
- reactjs - 目前没有配置加载器来处理这个文件
- bash - 使用空格分隔的文件名准备字符串并跳过名称已存在于 bash
- python - tensorflow/keras 神经网络中的复杂输入/输出是可能的吗?
- android - 如何在向右或向左移动时使用 ItemTouchHelper 移动到新的 Activity 或 Fragment
- splunk - splunk Enterprise 中的带宽
- apache-plc4x - 写入String类型数据提示【PlcRuntimeException: 尚未实现】
- cassandra - 错误:解析块映射时;预期的
,但在 cassandra.yaml 文件中找到了 BlockMappingStart