精通人脸识别06:Opencv读视频和摄像头
一、视频的读取:比较简单,只需要初始化一个VideoCapture对象,打开视频文件,逐帧读取。
代码如下:
#include <opencv2\highgui\highgui.hpp>
#include <iostream>
usingnamespace cv;
usingnamespace std;
intmain(intargc, char**argv)
{
//打开视频文件
VideoCapture capture("Girls'Generation.avi");
if(!capture.isOpened())
{
cout << "不能打开视频文件"<< endl;
return-1;
}
//从3000ms开始播放视频
//capture.set(CV_CAP_PROP_POS_MSEC, 3000);
//获取视频的帧速率
doublefps = capture.get(CV_CAP_PROP_FPS);
/*CV_CAP_PROP_POS_MSEC - 影片目前位置,为毫秒数或者视频获取时间戳
CV_CAP_PROP_POS_FRAMES - 将被下一步解压/获取的帧索引,以0为起点
CV_CAP_PROP_POS_AVI_RATIO - 视频文件的相对位置(0 - 影片的开始,1 - 影片的结尾)
CV_CAP_PROP_FOURCC - 表示codec的四个字符
CV_CAP_PROP_FRAME_COUNT - 视频文件中帧的总数
capture.set(CV_CAP_PROP_FRAME_WIDTH, 1080);//宽度
capture.set(CV_CAP_PROP_FRAME_HEIGHT, 960);//高度
capture.set(CV_CAP_PROP_FPS, 30);//帧数
capture.set(CV_CAP_PROP_BRIGHTNESS, 1);//亮度 1
capture.set(CV_CAP_PROP_CONTRAST,40);//对比度 40
capture.set(CV_CAP_PROP_SATURATION, 50);//饱和度 50
capture.set(CV_CAP_PROP_HUE, 50);//色调 50
capture.set(CV_CAP_PROP_EXPOSURE, 50);//曝光 50*/
cout << "帧/秒:"<< fps << endl;
namedWindow("MyVideo",CV_WINDOW_AUTOSIZE);
while(true)
{
Mat frame;
//从视频中读取一个帧
boolbSuccess = capture.read(frame);
if(!bSuccess)
{
cout <<"不能从视频文件读取帧"<< endl;
break;
}
//在MyVideo窗口上显示当前帧
imshow("MyVideo", frame);
//如果30ms没有按下键,就返回-1,当按下ESC键返回27
if(waitKey(30)==27)
{
cout << "按下ESC键"<< endl;
break;
}
}
return0;
}
相关函数原型bool
VideoCapture::set(
int
propId,
double
value)
doubleVideoCapture::get(
int
propId)
bool
VideoCapture::read(Mat& image);
二、从摄像头中采集视频
#include <opencv2\highgui\highgui.hpp>
#include <iostream>
usingnamespace cv;
usingnamespace std;
intmain(intargc, char**argv)
{
// 打开第1个摄像头
VideoCapture cap(0);
if(!cap.isOpened())
{
cout << "不能打开摄像头!"<< endl;
return-1;
}
//获取视频帧的宽度
doubledWidth = cap.get(CV_CAP_PROP_FRAME_WIDTH);
//获取视频帧的高度
doubledHeight = cap.get(CV_CAP_PROP_FRAME_HEIGHT);
cout << "视频帧尺寸 : "<< dWidth << " x "<< dHeight << endl;
namedWindow("MyVideo", CV_WINDOW_AUTOSIZE);
while(1)
{
Mat frame;
boolbSuccess = cap.read(frame);
if(!bSuccess)
{
cout << "不能从视频流中读取帧!"<< endl;
break;
}
imshow("MyVideo", frame);
if(waitKey(30) == 27)
{
cout << "ESC键被按下"<< endl;
break;
}
}
return0;
}