从摄像头或视频文件中读取视频流并显示
实验环境:
Windows10 x64
vs2013 + openCV2.4.11
实验目的:
学习OpenCV使用VideoCapture打开视频流的两种方法,了解视频流的读取,异常检测与处理,图像帧的显示。
代码:
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
/*
show 2 methods to read a video stream from online-camera or offline-file
C++ Class: VideoCapture
*/
int main()
{
// VideoCapture打开视频流方法1:直接在创建类时指定参数
VideoCapture capFromCamera(0);
VideoCapture capFromFile("E:\\video\\video.avi");
// VideoCapture打开视频流方法2:通过默认构造函数创建对象,然后通过open方法打开视频流
//VideoCapture capFromFile;
//capFromFile.open("E:\\video\\1.avi");
if (!capFromCamera.isOpened() || !capFromFile.isOpened())
{
return -1;
}
namedWindow("capFromCamera", 1);
namedWindow("capFromFile", 1);
cout << "对视频窗口按下任意键退出" << endl;
while (1)
{
Mat frameFromCamera, frameFromFile;
// get a new frame from camera
bool frameA = capFromCamera.read(frameFromCamera);
// get a new frame from file
bool frameB = capFromFile.read(frameFromFile);
if (!frameA || !frameB)
{
cout << "摄像头关闭或视频文件读取到结尾" << endl;
break;
}
imshow("capFromCamera", frameFromCamera);
imshow("capFromFile", frameFromFile);
// 当前帧被显示后,程序等待33ms,如果期间用户触发一个按键,循环退出,视频读入停止
if (waitKey(33) >= 0)
{
cout << "用户按下按键,退出程序" << endl;
break;
}
}
// 这两句可以省略,在程序结束前,VideoCapture会调用析构函数进行资源的释放
capFromCamera.release();
capFromFile.release();
destroyAllWindows();
cin.get();
return 0;
}