【问题标题】:What format i should convert the frames to to be used in openCV我应该将帧转换为什么格式以在openCV中使用
【发布时间】:2017-03-25 17:40:09
【问题描述】:

在我的应用程序中,我打开原生 android 相机并在 TextureView 上渲染预览,接下来我要做的是从相机中获取每一帧并使用 OpenCV 库执行一些处理和操作。

我也参考了这里的一些帖子Android decode Bitmap from Camera Previewhow to get RGB values of bitmap in android , How to capture preview image frames from Camera Application in Android Programming?

但我不知道我应该将检索到的帧转换为哪种格式,尤其是我想在 opeCV 中使用它,正如我之前所说,哪种格式产生良好的性能,我应该将它们转换为 YUV、JPEG 还是 NV21?

更新

我想使用原生 android 相机,然后将从相机检索到的帧转换为适用于 openCV 的另一种格式的原因是,当我使用 CvCameraViewListener2 时,相机预览周围总是有一个黑色区域,如下图所示图片,我无法摆脱它,所以我决定改用原生 android 相机

图片

【问题讨论】:

  • 为了获得最佳性能,您应该使用 Camera2 API 和 YUV_420_888 图像格式(与 NV21 相同)。据我所知,OpenCV 可以使用这种格式,也可以轻松转换为 RGB。
  • @MaximMetelskiy 实际上我无法使用 camera2 API,因为我的设备的 sdk 版本是 18 ......你的意思是 opencv 可以直接使用“YUV_420_888”和“NV21”而无需任何高级转换? ?
  • @MaximMetelskiy 如何将 NV21 转换为 RGB?请咨询
  • 看这里stackoverflow.com/questions/23122957/…。你确定你需要RGB图像吗?可能只有灰度部分就足够了吗?这样你就可以避免任何对话。

标签: android image-processing bitmap android-camera opencv4android


【解决方案1】:

如果您的 Activity 实现了 OpenCV 的 CameraBridgeViewBase.CvCameraViewListener2,它还将实现带有 CvCameraViewFrame 参数的 onCameraFrame 方法。

您可以从中获取灰度或 RGBA 格式的图像。 This guy does it in this tutorial。本教程是关于集成原生 C++ OpenCV 代码,但如果您不需要这样做,只需注意他在 MainActivity 上工作的部分即可。

编辑:如果您可以以字节数组的形式访问预览帧的数据,您是否尝试过简单地将这些数据放入垫子中?

Mat foo = new Mat(height, width, type); //type is probably CvType.CV_8UC1
foo.put(0, 0, data);

【讨论】:

  • 是的,我知道如何实现 OpenCV 的 CameraBridgeViewBase.CvCameraViewListener2,我用它做了一个项目,它工作正常。我想使用原生android相机然后将从相机检索到的帧转换为适用于openCV的另一种格式的原因是,当我使用CvCameraViewListener2时,相机预览周围总是有一个黑色区域“我将发布图片”和我无法摆脱它,所以我决定改用原生 android 相机。但是我应该将帧转换成什么格式,这样我就无法使用 opencv 对其进行一些处理。请建议
  • 显然是想弄乱我的评论。改为编辑我的答案。
  • 但问题是预览周围的黑色区域永远无法访问。位置 (0,0) 处的像素是指预览区域的最左上角,而不是黑色区域
猜你喜欢
  • 1970-01-01
  • 2012-01-16
  • 1970-01-01
  • 2022-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多