OpenCV:如何从网络摄像头获取原始的YUY2图像?

4
你知道如何使用OpenCV-DirectShow(不使用VFW)从网络摄像头获取原始的YUY2图像吗?
http://opencv.willowgarage.com/wiki/CameraCapture中,我成功地使用了示例获取了IPL图像(Intel Processing Library image)。
在代码中使用cvShowImage()函数时,屏幕上的图像很好。但我不想在屏幕上显示图像,也不需要IPL格式,我只需要YUYV原始数据……
维基百科页面的第二部分正是我想要的,但deviceSetupWithSubtype()在OpenCV 2.4中似乎不再存在(即使Google也不知道它)。
编辑:我已经找到了:它在链接到页面的rar文件中!Google在rar文件中看不到。这是链接:http://opencv.willowgarage.com/wiki/CameraCapture?action=AttachFile&do=get&target=Camera+property+Settings.rar 。我将研究这个。

+1 如果您回答了这个问题,谢谢。 - Bobbi Bennett
捕获相机提供的格式之一的视频是典型的DirectShow任务。 YV12可能是或可能不是这样的格式。更重要的是,Windows Vista+提供了一个颜色空间转换组件。在XP中,您需要(在Vista+中您可能更喜欢)第三方项目来完成此操作。 - Roman R.
2个回答

2

如果有其他人也遇到了这个问题:

FFmpeg在Windows上拥有一个很好的API,可以允许原始YUV图像捕获。可以使用命令行界面:

Original Answer翻译成"最初的回答"

ffmpeg.exe -f dshow -i video="your-webcam" -vframes 1 test.yuv

最初的回答
或者他们的C API:
AVFormatContext *camera = NULL;
  AVPacket packet;
  avdevice_register_all();
  AVInputFormat *inFrmt = av_find_input_format("dshow");
  int ret = avformat_open_input(&camera, "video=your-webcam", inFrmt, NULL);
  av_init_packet(&packet);

  while (int ret = av_read_frame(camera, &packet) >= 0) {
    // packet.data has raw image data
  }

0
通常情况下,OpenCV 在 Windows 中使用 DirectShow 从网络摄像头获取 RGB 帧。OpenCV VideoCapture 类获取 CV_CAP_PROP_CONVERT_RGB 属性(一个布尔标志,指示是否应将图像转换为 RGB),但它在我的所有网络摄像头中都不起作用。
与其编写 DirectShow 代码并创建自己的示例抓取器和回调以获取 YUY2 数据,不如描述 这里(他们已经制作了精美的工具来简化 DirectShow 开发)。我修改了 CameraDs 和 (设置文档) 类(网页为中文)以获取 YUY2 数据。
在CameraDs.cpp中将mt.subtype = MEDIASUBTYPE_RGB24; 更改为 mt.subtype = MEDIASUBTYPE_YUY2;(检查您的网络摄像头是否支持此格式)
并生成一个YUY2图像,通道数为2而不是RGB的3个通道。
m_pFrame = cvCreateImage(cvSize(m_nWidth, m_nHeight), IPL_DEPTH_8U, 2);

并获取外部的YUY2数据,并使用OpenCV接口将其转换为RGB,如下所示:

{
               //query frame
               IplImage * pFrame = camera. QueryFrame();


               //change them to rgb
               Mat yuv (480, 640,CV_8UC2 ,pFrame-> imageData);
               Mat rgb (480, 640,CV_8UC3 );

               cvtColor(yuv ,rgb, CV_YUV2BGRA_YUY2);

               //show image
               //cvShowImage("camera", rgb);
               imshow("camera" ,rgb);

               if ( cvWaitKey(20 ) == 'q')
                      break;
        } 

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