热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

opencv之VideoCapture与VideoWriter笔记

opencv版本:opencv3.4.11.VideoCapture类作用:捕获视频文件,图像序列或摄像头;classVideoCapture{public:构造VideoC

opencv版本:opencv3.4.1 


1. VideoCapture类 

 作用: 捕获视频文件,图像序列或摄像头;

class VideoCapture
{
public://构造VideoCapture();VideoCapture(const String& filename);//apiPreference参数取值:cv::CAP_FFMPEG or cv::CAP_IMAGES or cv::CAP_DSHOW等VideoCapture(const String& filename, int apiPreference);VideoCapture(int index);//析构virtual ~VideoCapture();//打开视频文件或捕获设备或IP视频流以进行视频捕获virtual bool open(const String& filename);//打开摄像机进行视频捕获virtual bool open(int index);bool open(int cameraNum, int apiPreference);virtual bool open(const String& filename, int apiPreference);//若视频捕获已经被初始化(打开),返回true;virtual bool isOpened() const;//关闭视频文件或捕获设备。virtual void release();//从视频文件或捕获设备中捕获下一帧。virtual bool grab();/*解码并返回抓取的视频帧。image为捕获返回的视频帧,没有帧被捕获image为空;成功不会返回true;*/virtual bool retrieve(OutputArray image, int flag = 0);//抓取、解码并返回下一个视频帧。virtual bool read(OutputArray image);//设置VideoCapture中的属性。virtual bool set(int propId, double value);//返回指定的VideoCapture属性virtual double get(int propId) const;...
};

测试代码:

int main()
{VideoCapture capture;capture.open("./video/xxx.AVI");if(!capture.isOpened()){std::cout <<"failed to open video!" < frameImg ;if(!frameImg.empty()){imwrite("./video/inc835.jpg", frameImg);break;}}capture.release();return 0;
}

 2. VideoWriter类

 作用: 写视频文件或图像序列;

class VideoWriter
{
public://构造VideoWriter();/*filename:输出视频文件的文件名 fourcc:用于压缩帧的编解码器的4个字符代码。fps:帧率frameSize:帧宽高大小;isColor:非0,编码器将期望并编码彩色帧;否则,灰度帧;*/VideoWriter(const String& filename, int fourcc, double fps,Size frameSize, bool isColor &#61; true);//apiPreference参数: cv::CAP_FFMPEG or cv::CAP_GSTREAMER等VideoWriter(const String& filename, int apiPreference, int fourcc, double fps,Size frameSize, bool isColor &#61; true);//析构virtual ~VideoWriter();//打开文件virtual bool open(const String& filename, int fourcc, double fps,Size frameSize, bool isColor &#61; true);bool open(const String& filename, int apiPreference, int fourcc, double fps,Size frameSize, bool isColor &#61; true);//若视频输出已经被成功初始化(打开),返回true;virtual bool isOpened() const;//关闭视频输出virtual void release();//写下一帧virtual void write(const Mat& image);virtual bool set(int propId, double value);virtual double get(int propId) const;//将4个字符连接到一个fourcc代码static int fourcc(char c1, char c2, char c3, char c4);protected:Ptr writer;Ptr iwriter;static Ptr create(const String& filename, int fourcc, double fps,Size frameSize, bool isColor &#61; true);
};

测试代码:

int main()
{VideoCapture inputVideo("./video/INC835.AVI");if(!inputVideo.isOpened()){std::cout <<"----VideoCapture open failed----" < rgb;cv::Mat resultImg;while(1){inputVideo >> frameImg;if(!frameImg.empty()){cv::split(frameImg, rgb); //分离出三通道rgb;for(int i &#61;0; i <3; i&#43;&#43;){#if 1if(i !&#61; 0){//提取B通道分量rgb[i] &#61; cv::Mat::zeros(Size(imageW,imageH), rgb[0].type());}#endif//通道合并cv::merge(rgb, resultImg);}outputVideo <}

 

outputVideo.open(fileName, -1,25.0,Size(imageW,imageH),false);

错误: 调用outputVideo.open出现OpenCV: FFMPEG: tag 0xffffffff/&#39;&#xfffd;&#xfffd;&#xfffd;&#xfffd;&#39; is not found (format &#39;avi / AVI (Audio Video Interleaved)&#39;)&#39;

处理: 将参数2改为使用fourcc生成;具体字段需要根据编码确定;

如: outputVideo.open(fileName, VideoWriter::fourcc(&#39;M&#39;,&#39;J&#39;,&#39;P&#39;,&#39;G&#39;),25.0,Size(imageW,imageH),false);

或fourcc(&#39;F&#39;,&#39;M&#39;,&#39;P&#39;,&#39;4&#39;)&#xff1b;

参考: python错误&#xff1a;OpenCV: FFMPEG: tag 0xffffffff/’&#xfffd;&#xfffd;&#xfffd;&#xfffd;‘’is not found (format ’mp4 / MP4 (MPEG-4 Part 14)’)’-python黑洞网


推荐阅读
  • 在Java开发中,如何利用ProcessBuilder类调用外部程序是一个常见的需求。本文将详细介绍ProcessBuilder类的使用方法,并提供示例代码帮助你更好地理解和应用。 ... [详细]
  • FFPlay 字幕与LRC歌词播放指南
    本文详细介绍了不同媒体容器支持的字幕格式,以及如何使用FFPlay和FFMPEG进行字幕和LRC歌词的播放与转换。涵盖的内容包括字幕显示方法、字体配置、字幕流选择等。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文探讨了Hive中内部表和外部表的区别及其在HDFS上的路径映射,详细解释了两者的创建、加载及删除操作,并提供了查看表详细信息的方法。通过对比这两种表类型,帮助读者理解如何更好地管理和保护数据。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • 本文详细介绍如何在 macOS 上编译 FFmpeg 3.1.1,并将其集成到 iOS 项目中,包括必要的环境配置和代码示例。 ... [详细]
  • 深入解析JVM垃圾收集器
    本文基于《深入理解Java虚拟机:JVM高级特性与最佳实践》第二版,详细探讨了JVM中不同类型的垃圾收集器及其工作原理。通过介绍各种垃圾收集器的特性和应用场景,帮助读者更好地理解和优化JVM内存管理。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文介绍了如何使用 Spring Boot DevTools 实现应用程序在开发过程中自动重启。这一特性显著提高了开发效率,特别是在集成开发环境(IDE)中工作时,能够提供快速的反馈循环。默认情况下,DevTools 会监控类路径上的文件变化,并根据需要触发应用重启。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 精通C++并非易事,为何它比其他语言更难掌握?这主要归因于C++的设计理念,即不强迫用户接受特定的编程风格或限制创新思维。本文探讨了如何有效学习C++,并介绍了几本权威的学习资源。 ... [详细]
author-avatar
手机用户2502921293
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有