你知道如何使用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。我打算研究这个。
通常,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;
}
万一其他人偶然发现:
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
}