首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐
2025年6月14日 星期六 1:35pm

【OpenCV3】视频读写——cv::VideoCapture和cv::VideoWriter详解

  • 23-09-22 20:41
  • 2745
  • 10744
blog.csdn.net

OpenCV3和OpenCV2类似,视频的读、写操作,分别通过cv::VideoCapture和cv::VideoWriter两个类来实现。


1、视频的读取操作cv::VideoCapture

cv::VideoCapture既支持视频文件的读取,也支持从摄像机中视频的读取。cv::VideoCapture对象的创建方式有以下三种:

  1. cv::VideoCapture capture(
  2. const string& filename, // 输入文件名
  3. );
  4. cv::VideoCapture capture(
  5. int device // 视频捕捉设备 id
  6. );
  7. cv::VideoCapture capture();


第一种方式是从文件(.MPG或.AVI格式)中读取视频,对象创建以后,OpenCV将会打开文件并做好准备读取它,如果打开成功,我们将可以开始读取视频的帧,并且cv::VideoCapture的成员函数isOpened()将会返回true(建议在打开视频或摄像头时都使用该成员函数判断是否打开成功)。

第二种方式是从摄像机中读取视频,这种情况下,我们会给出一个标识符,用于表示我们想要访问的摄像机,及其与操作系统的握手方式。对于摄像机而言,这个标志符就是一个标志数字——如果只有1个摄像机,那么就是0,如果系统中有多个摄像机,那么只要将其向上增加即可。标识符另外一部分是摄像机域(camera domain),用于表示摄像机的类型,这个域值可以是下面任一预定义常量。


以这种方式创建视频捕获对象时,我们所传递的标识符是域索引和摄像机索引的和。例如:

cv::VideoCapture capture(cv::CAP_IEEE1394 + 1);

这个例子中cv::VideoCapture将尝试打开第2个(编号从0开始)1394摄像机。多数情况下,由于我们只有一个摄像机,因此没必要指定摄像机的域,此时使用cv::CAP_ANY是一种高效的方式(也即是0,所以不用特意指定)。

第三种方式仅仅创建一个捕获对象,而不提供任何关于打开的信息。创建以后通过成员函数open()来设定打开的信息。open()操作也有以上两种方式。

  1. cv::VideoCapture cap;
  2. cap.open( "my_video.avi" );

将视频帧读取到cv::Mat矩阵中,有两种方式:一种是read()操作;另一种是 “>>”操作。

  1. cv::Mat frame;
  2. cap.read(frame); //读取方式一
  3. cap >> frame; //读取方式二

下面是读取视频并显示的示例代码:

  1. #include
  2. #include
  3. void video_capture_test()
  4. {
  5. cv::VideoCapture capture("test.mp4");
  6. if (!capture.isOpened())
  7. {
  8. std::cout << "Read video Failed !" << std::endl;
  9. return;
  10. }
  11. cv::Mat frame;
  12. cv::namedWindow("video test");
  13. int frame_num = capture.get(cv::CAP_PROP_FRAME_COUNT);
  14. std::cout << "total frame number is: " << frame_num << std::endl;
  15. for (int i = 0; i < frame_num - 1; ++i)
  16. {
  17. capture >> frame;
  18. //capture.read(frame); 第二种方式
  19. imshow("video test", frame);
  20. if (cv::waitKey(30) == 'q')
  21. {
  22. break;
  23. }
  24. }
  25. cv::destroyWindow("video test");
  26. capture.release();
  27. return;
  28. }

上面的代码,我们使用了cv::VideoCapture的成员函数get()并设定标识cv::CAP_PROP_FRAME_COUNT获取了读取视频的帧总数。同样,我们可以指定其他标识,来获取读取视频或摄像头的其他属性。另外,我们也可以使用成员函数set(),设定相应属性的值。cv::VideoCapture中提供的属性标识如下图所示。



2、视频的写操作cv::VideoWriter

cv::VideoWriter对象的创建有两种方式,第一种是使用构造函数的形式,第二种使用open()的方式,具体如下:

  1. cv::VideoWriter out(
  2. const string& filename, // 输入文件名
  3. int fourcc, // 编码形式,使用 CV_FOURCC()宏
  4. double fps, // 输出视频帧率
  5. cv::Size frame_size, // 单帧图片的大小
  6. bool is_color = true // 如果是false,可传入灰度图像
  7. );
  8. cv::VideoWriter out;
  9. out.open(
  10. "my_video.mpg", //输出文件名
  11. CV_FOURCC('D','I','V','X'), // MPEG-4 编码
  12. 30.0, // 帧率 (FPS)
  13. cv::Size( 640, 480 ), // 单帧图片分辨率为 640x480
  14. true // 只输入彩色图
  15. );

同样,向创建后的cv::VideoWriter对象写入图像也有两种方式,即write()操作和“<<”操作:

  1. cv::VideoWriter::write(
  2. const Mat& image // 写入图像作为下一帧
  3. );
  4. my_video_writer << my_frame;


2017.03.30

文章知识点与官方知识档案匹配,可进一步学习相关知识
OpenCV技能树视频分析光流20473 人正在系统学习中
注:本文转载自blog.csdn.net的PHILOS_THU的文章"http://blog.csdn.net/guduruyu/article/details/68486063#"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top