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

时间:2012-05-17 06:11:51

标签: image opencv webcam yuv

您是否知道如何使用OpenCV-DirectShow(无VFW)从网络摄像头获取原始YUY2 图像?

http://opencv.willowgarage.com/wiki/CameraCapture:我使用示例成功获取了IPL图像(英特尔处理库图像)。

在代码中使用函数cvShowImage(),图像在屏幕上很好用。但我不想在屏幕上显示图像,也不想在IPL格式中显示图像,我只想要YUYV原始数据......

维基页面的第二部分将是我想要的,但是在OpenCV 2.4中似乎不再存在deviceSetupWithSubtype()(甚至谷歌也不知道)。

编辑:我发现:它在页面上链接的rar文件中!谷歌没有“看到”rar文件。这是链接:http://opencv.willowgarage.com/wiki/CameraCapture?action=AttachFile&do=get&target=Camera+property+Settings.rar。我打算研究这个。

2 个答案:

答案 0 :(得分:0)

通常,opencv使用directshow从Windows中的网络摄像头获取RGB帧。 Opencv VideoCapture类获取CV_CAP_PROP_CONVERT_RGB属性(布尔标志指示将图像转换为RGB),但它在我的所有网络摄像头中都不起作用。

而不是编写DirectShow代码并制作自己的样本抓取器和回调来获取YUY2数据desribe here(他们为简化directshow开发提供了很好的工具。)我修改了CameraDs和({ {3}})类(网页为中文)获取YUY2数据。

在CameraDs.cpp中将mt.subtype = MEDIASUBTYPE_RGB24;更改为mt.subtype = MEDIASUBTYPE_YUY2;(检查您的网络摄像头是否支持此功能)

并制作2通道YUY2图像而不是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;
        } 

答案 1 :(得分:0)

万一其他人偶然发现:

ffmpeg具有适用于Windows的良好API,该API允许捕获原始YUV图像。或CLI:

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
  }