DirectShow是微软提供的一套在Windows上使用的流媒体框架,9.0之前与DirectX一起发布,之后包含在Windows sdk中,所以Win10及以上都是在Windows sdk中直接包含了。
Microsoft Media Foundation是Windows上的第二代流媒体框架,学习参考网址:https://docs.microsoft.com/en-us/windows/win32/medfound/microsoft-media-foundation-sdk
两者都可以获取usb相机的rgb数据流,只是DirectShow的使用可能跟电脑的配置有关,比如我曾经做过一个PC上的软件,获取并显示rgb相机的数据流,先用的DirectShow,在我自己的联想win10电脑上可以正常运行,换了一台DELL的电脑运行,死活有问题,最终考虑用Microsoft Media Foundation。
其实opencv的VideoCapture可以打开相机设备也可以选择使用哪种API,比如:
cv::VideoCapture cap(1+cv::CAP_DSHOW); //用Directshow打开
cv::VideoCapture cap(0+CAP_MSMF); //用Microsoft Media Foundation打开,和上边那个效果一样,只是camera的顺序不一样,所以参数是0或者1
//设置帧的宽
bool ifSuccess=cap.set(CV_CAP_PROP_FRAME_WIDTH,2560);
//设置帧高
ifSuccess=cap.set(CV_CAP_PROP_FRAME_HEIGHT,1440);
//设置数据流的格式为MJPG
ifSuccess= cap.set(CV_CAP_PROP_FOURCC,cv::VideoWriter::fourcc('M','J','P','G'));
//预览
cv::Mat frame;
while(cap.isOpened())
{
cap>>frame;
cv::imshow("video", frame);
cv::waitKey(30);
}
但是如果想拿到H264格式的rgb数据流,opencv就不可以了,因为没这个格式可以设置,但是DirectShow和Microsoft media foundation都可以直接获取H264格式的数据流,不过DirectShow和电脑有关,我自己做了一个demo,可以通过两种方式枚举并获取UVC相机的数据流。界面如下:
勾选上DDSHOW或者WMF,然后就能枚举出电脑上的camera设备,也能枚举出支持的格式,分辨率,帧率;支持采图,并保存为.jpg格式。
demo下载地址:https://download.csdn.net/download/asla_1/16342631