本系列只说明视频处理,不涉及其他复杂图像操作。
先写一段最简单的代码来初步认识一下:
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
int main(int argc,char * argv[]){
VideoCapture cap(0); //打开默认相机
Mat img; //图像容器
while(1){
cap >> img; //读取一幅画面
imshow("test",img); //显示画面
if(waitKey(1000/30)>0){ //接收按键并使画面延迟多少毫秒
break;
}
}
cap.release(); //关闭相机
return 0;
}
注意:
imshow和waitKey是伴随出现的,两者缺一都会失去效果。
当不适用waitKey延持是可以用sleep控制帧率。
视频获取最大帧率取决于摄像头的捕获帧率,比如摄像头最大支持30帧,即使没有延时函数一秒也只能循环三十次,这并不意味着获取一帧需要1/30秒,只是在花时间在等摄像头准备好捕获下一帧图像,如果只是单纯的取数据是很快的,所以完全不必要去死等,在下一帧图像捕获完成之前可以去做其他任务,但请注意加上获取视频的时间不要超过1/30秒,这里1/30只是个比喻,另外外接usb摄像头质量和连接的usb接口类型也会影响视频的捕获帧率。
在linux下使用VideoCapture cap(0),读取本机摄像头时,不能使用setitimer设置定时器,否则将导致opencv运行异常,可能是opencv内部使用了定时器。