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

问题描述 投票:4回答:2

你知道如何使用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。我打算研究这个。

image opencv webcam yuv
2个回答
0
投票

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

而不是编写DirectShow代码并制作自己的样本抓取器和回调来获取YUY2数据desribe here(他们hava制作了简化directshow开发的精彩工具。)我修改CameraDs和(setup Doc)类(网页是中文)到获取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;
        } 

0
投票

万一其他人偶然发现:

ffmpeg有一个很好的Windows 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
  }
© www.soinside.com 2019 - 2024. All rights reserved.