如何向Opencv提供YUV数据输入?

5
我是一名Opencv的初学者。在我的新Opencv项目中,我需要从摄像头设备捕获视频帧,并将它们交给Opencv进行处理,但现在我的摄像头出了故障(硬件问题)。因此,我需要使用同类型另一个摄像头设备获取的YUV文件来测试Opencv应用程序。
所以我的问题是:
1、我如何将YUV数据提供给Opencv?Opencv是否支持YUV数据?
2、根据我的调查,我得知Opencv将捕获的帧转换为Mat格式。那么,有没有办法直接将YUV数据转换为Mat对象并提供给Opencv进行处理?
3、我的设备没有任何MPEG、AVI等编解码器。
2个回答

3

我最近在这里提出了一个类似的问题:OpenCV捕获YUYV格式的摄像头视频而不进行RGB格式转换

使用openCV VideoCapture对象可以最简单地捕获视频,但它会自动将帧转换为BGR格式。您可以通过videoCapture.set(CV_CAP_PROP_CONVERT_RGB, false)来禁用此功能。

由于某些原因,该特定命令在我的摄像头上无法正常工作,因此我被迫使用V4L2库来读取帧(这是videoCapture使用的相同库)。 V4L2的示例视频捕获代码:http://linuxtv.org/downloads/v4l-dvb-apis/capture-example.html。然后,我将帧存储在cv :: Mat中以供处理。

您可以在openCV Mat中存储任何格式的数据,但某些操作会对数据格式进行假设。例如,imshow将假定数据为BGR或灰度格式。如果您的数据不属于这些格式之一,则图像将显示错误。


1
简短的回答是:是的,您可以通过将其转换为Mat来呈现YUV数据给OpenCV。请参见我对相关问题的回答
如果您的YUV数据以原始视频的形式存在,请使用文件I/O逐帧从yuv视频文件中读取(作为char数组),并使用我在上面提到的方法将其转换为Mat。
当您的相机硬件工作并且您使用OpenCV捕获(例如VideoCapture)时,它会将YUV流转换为BGR。没有办法直接从相机将原始YUV流传输到OpenCV中。如果您需要在原始YUV流上进行操作(例如以自定义方式解释负载),唯一的方法是直接使用像V4L2这样的库从相机读取YUV流并将其转换为Mat,然后使用其他OpenCV函数。但这超出了主题的范围。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接