《学习OpenCV 3(中文版)》 —第二个程序:视频
第二个程序:视频
用OpenCV播放视频就像显示图像一样简单。唯一不同的是,我们需要某种循环来读取视频序列中的每一帧。我们也许还需要一些方法在电影太无聊的时候来帮助跳出循环。
示例2-3:一个简单的播放视频文件的OpenCV程序
#include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" int main( int argc, char** argv ) {
cv::namedWindow( "Example3", cv::WINDOW_AUTOSIZE ); cv::VideoCapture cap;
cap.open( string(argv[1]) );
cv::Mat frame; for(;;) {
cap >> frame; if( frame.empty() ) break; // Ran out of film cv::imshow( "Example3", frame ); if( cv::waitKey(33) >= 0 ) break;
}
return 0;
}
main函数从创建一个窗口开始(在本例中窗口名为"Example3"),视频读取结构 cv::VideoCapture在其后被加载进来。这个结构可以打开和关闭很多类型的ffmpeg支持的视频文件。
cap.open(string(argv[1])); cv::Mat frame;
视频读取结构通过传入字符串打开文件,这个字符串指示了想要打开的视频文件的路径。一旦视频被打开,视频读取结构将会包含所有的关于这个视频文件可以读取的属性,包括状态信息。以这样的方式创建以后,cv::VideoCapture结构将会在视频的开头被初始化。在这个程序中,cv::Mat frame声明了一个可以保存视频帧的结构。
cap >> frame;
if( frame.empty() ) break;
cv::imshow( "Example3", frame );
一旦内部的while()循环开始执行,视频文件会按照帧从视频流中被读取。这个程序通过if(frame.empty())检查数据是不是真的从视频中读了出来,如果没有,程序将会退出。如果视频帧被成功读取,将通过cv::imshow()显示。
if( cv::waitKey(33) >= 0 ) break;
一旦显示了这帧图片,我们会等待33毫秒。注4如果用户在这段时间在键盘有任何输入,我们将退出循环。如果没有发生,33毫秒之后我们会跳过并执行下一个循环。在退出的时候,所有数据的内存空间将会由于生命周期的结束被自动释放掉。
- 点赞
- 收藏
- 关注作者
评论(0)