参考:
://blog.csdn.net/lunweiwangxi3/article/details/88556911
http://blog.sina.com.cn/s/blog_9b493e7b0102xvn6.html
总结http://stackoverflow.com/questions/16092802/capturing-1080p-at-30fps-from-logitech-c920-with-opencv-2-4-3得出经验如下:
opencv可以捕获摄像头数据。如果要读高分辨率和高帧率,可以用如下的设置:
capture.set(CV_CAP_PROP_FPS, 30);
capture.set(CV_CAP_PROP_FRAME_WIDTH, 1920);
capture.set(CV_CAP_PROP_FRAME_HEIGHT, 1080);
如果只按照常规的读取方法帧率其实达不到30fps,所以必须对读到的视频帧进行压缩,故还需要设置:
capture.set(CV_CAP_PROP_FOURCC, CV_FOURCC('M', 'J', 'P', 'G'));
这样将视频帧压缩之后,就可以让摄像头在1080p及30fps下工作。
注意:
设置参数的顺序一定是格式、帧率、宽/高,否则不能正常工作。
代码如下:
#include "iostream"
using namespace std;
#include "opencv2\opencv.hpp"
using namespace cv;
int main()
{
VideoCapture capture(0);
if (!capture.isOpened())
{
cout << "未发现摄像头!" << endl;
return -1;
}//检测是否成功打开摄像头
Mat frame;
capture.set(CV_CAP_PROP_FOURCC, CV_FOURCC('M', 'J', 'P', 'G'));
capture.set(CV_CAP_PROP_FPS, 30);
capture.set(CV_CAP_PROP_FRAME_WIDTH, 1920);
capture.set(CV_CAP_PROP_FRAME_HEIGHT, 1080);
while (1)
{
capture >> frame;
if (!capture.read(frame))//这个判断的必须的
break;
//中间可插入各种对图像的处理
imshow("frame", frame);
if (waitKey(30) >= 0)//刷新间隔30ms,按任意键退出
break;
}
return 0;
}//opencv2读取摄像头