您是否知道如何使用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。我打算研究这个。答案 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
}