先说结论,在windows7+X64平台上使用vs studio 2017读取摄像头遇到一个问题就是.
CvCapture_MSMF::initStream Failed to set mediaType (stream 0, (640x480 @ 30) MFVideoFormat_RGB24(unsupported media type)
最后发现是在调用VideoCapture类open摄像头时的参数默认情况下是bool open(int index, int apiPreference = CAP_ANY),但是问题就出出现在这里,出现这个错误时不使用默认值,需要显示的指定参数CAP_DSHOW,代码如下:
#include <iostream>
#include <opencv2\highgui.hpp>
#include <opencv2\core.hpp>
#include <opencv2\imgcodecs.hpp>
using namespace cv;
using namespace std;
int main()
{
//读取图片并显示出来
//Mat image;
//image = imread("D:/VS2017_project/image_cv/mm.jpeg"); //后缀名不区分大小写 路径可以协程这样也可以写为D:\\VS2017_project\\image_cv\\ss.jpg
//if (image.empty())
//{
// cout << "cannot open or find image" << endl;
// system("pause");
// return -1;
//}
//namedWindow("Display window", WINDOW_NORMAL);
//resizeWindow("Display window",1000,500);
//imshow("Display window", image);
//waitKey(0);
//system("pause");
//读取摄像头数据
namedWindow("video", WINDOW_AUTOSIZE);
Mat image; //mat中文意思矩阵
VideoCapture video; //视频抓取类
bool isopen = video.open(0, CAP_DSHOW);//当出现上文出现的错误时,使用CAP_DSHOW
if (!isopen)
cout << "open camero failed" << endl;
else
cout << "open camero success" << endl;
cout << video.isOpened() << endl;
while (1)
{
bool ret = video.read(image); //读取图像帧
if (!ret)
{
cout << "grab from video failed" << endl;
break;
}
imshow("video", image); //图像帧显示,需指明图像帧显示的窗口名称和图像帧
int key = waitKey(1); //指定1ms刷新一个图像帧,并且该函数能返回鼠标或者键盘的返回
if (key == 'q')
break;
}
cout << "while break" << endl;
video.release(); //释放资源
destroyAllWindows(); //释放资源
system("pause");
return 0;
}