《学习OpenCV 3(中文版)》 —第二个程序:视频

举报
清华大学出版社 发表于 2019/10/23 20:52:58 2019/10/23
【摘要】 本节书摘来自清华大学出版社《学习OpenCV 3(中文版)》 一书中第二章,作者是[美]安德里安 • 凯勒 (Adrian Kaehler) 加里 • 布拉德斯基 (Gary Bradski) , 阿丘科技 刘昌祥 吴雨培 王成龙 崔玉芳 等译。

第二个程序:视频

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毫秒之后我们会跳过并执行下一个循环。在退出的时候,所有数据的内存空间将会由于生命周期的结束被自动释放掉。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。