本次要记录的知识点很简单,但是也很实用,就是在OpenCV中关于摄像头的调用及视频的读取。
具体代码如下:
/********************读取视频;调用摄像头********************/
VideoCapture capture;
capture.open(0);
if (!capture.isOpened())
{
cout << "读取失败" << endl;
}
int width = capture.get(CAP_PROP_FRAME_WIDTH);
int height = capture.get(CAP_PROP_FRAME_HEIGHT);
int count = capture.get(CAP_PROP_FRAME_COUNT); //视频总帧数
int fps = capture.get(CAP_PROP_FPS);
cout << "width:" << width << " ";
cout << "height:" << height << " ";
cout << "count:" << count << " ";
cout << "fps:" << fps << " ";
int type = saturate_cast<int>(capture.get(CAP_PROP_FOURCC)); //声明视频保存格式
//VideoWriter writer("D:\\opencv_c++\\video.mp4", type, fps, Size(width, height), true);
Mat frame;
namedWindow("frame", WINDOW_AUTOSIZE);
while (capture.read(frame))
{
imshow("frame", frame);
//writer.write(frame);
char c = waitKey(fps);
if (c == 27)
{
break;
}
}
capture.release();
//writer.release();
首先使用VideoCapture capture;
来定义一个VideoCapture类对象capture,这个capture可以理解为用来调用摄像头的接口。
接着就使用capture.open(0);
这个函数来打开摄像头或者是视频,当参数设置为0时,即为调用电脑自带的摄像头,当设置为其他设备提供的ip地址时,可以调用外部设备的摄像头,例如手机上下载“ip摄像头”这个APP就可以提供一个ip地址,传入该参数后可以使用电脑来调用手机的摄像头;当该参数设置为某个视频文件的路径时,意思是打开该视频文件。
随后判断摄像头或视频文件是否成功打开,通过capture.isOpened()
这个函数来判断,如果成功,该函数放回true;如果失败则返回false。
以下几行代码的作用是获取打开的视频的格式信息,如每一帧的宽度、高度、总帧数和帧率。
int width = capture.get(CAP_PROP_FRAME_WIDTH);
int height = capture.get(CAP_PROP_FRAME_HEIGHT);
int count = capture.get(CAP_PROP_FRAME_COUNT); //视频总帧数
int fps = capture.get(CAP_PROP_FPS);
下面这个while循环就是实现了实时捕获画面并显示出来。通过capture.read(frame)
来获取每一帧图像并用变量frame表示,并在一个窗口上显示出来。而char c = waitKey(fps)
是通过waitkey()函数来获取用户的键盘输入并赋值给变量c。‘27’代表的是键盘上的esc键,当程序执行时会陷入while死循环,直到用户按下esc键才退出。
while (capture.read(frame))
{
imshow("frame", frame);
//writer.write(frame);
char c = waitKey(fps);
if (c == 27)
{
break;
}
}
如果要将捕获的视频保存起来,可以用VideoWriter writer("D:\\opencv_c++\\video.mp4", type, fps, Size(width, height), true)
来实现。其中VideoWriter类对象writer的第一个参数,是要保存的路径;第二个参数是保存的文件类型,可以预先通过int type = saturate_cast<int>(capture.get(CAP_PROP_FOURCC))
来定义,其中是获取视频的FOURCC(四字符码),并转换成int类型,再赋值给变量type;第三个参数是保存视频的帧率;第四个参数是保存视频的每一帧图像的尺寸;第五个参数是布尔型,true表示是有颜色的视频。
然后在while循环中,加上writer.write(frame)
来将每一帧图像写入视频并保存起来。
最后要注意的是,一定要通过capture.release(); writer.release();
这两行代码,将调用的capture和writer释放掉,否则可能会因为被占用的问题而报错。