我应该将帧转换为啥格式以在openCV中使用

Posted

技术标签:

【中文标题】我应该将帧转换为啥格式以在openCV中使用【英文标题】: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 Preview, how 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?请咨询 看这里***.com/questions/23122957/…。你确定你需要RGB图像吗?可能只有灰度部分就足够了吗?这样你就可以避免任何对话。 【参考方案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) 处的像素是指预览区域的最左上角,而不是黑色区域

以上是关于我应该将帧转换为啥格式以在openCV中使用的主要内容,如果未能解决你的问题,请参考以下文章

当对象靠近opencv时将帧保存到文件中

将帧(作为整数)转换为格式正确的视频时间码

OpenCV将帧附加到现有视频(.avi)文件?

使用OpenCV和Android NDK转换数据格式

opencv编程中错误提示:不存在从mat到cvmat适当的转换函数。

python 使用 opencv 库对图片进行格式转换