热门标签 | 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黑洞网


推荐阅读
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • 从零学Java(10)之方法详解,喷打野你真的没我6!
    本文介绍了从零学Java系列中的第10篇文章,详解了Java中的方法。同时讨论了打野过程中喷打野的影响,以及金色打野刀对经济的增加和线上队友经济的影响。指出喷打野会导致线上经济的消减和影响队伍的团结。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • Python爬虫中使用正则表达式的方法和注意事项
    本文介绍了在Python爬虫中使用正则表达式的方法和注意事项。首先解释了爬虫的四个主要步骤,并强调了正则表达式在数据处理中的重要性。然后详细介绍了正则表达式的概念和用法,包括检索、替换和过滤文本的功能。同时提到了re模块是Python内置的用于处理正则表达式的模块,并给出了使用正则表达式时需要注意的特殊字符转义和原始字符串的用法。通过本文的学习,读者可以掌握在Python爬虫中使用正则表达式的技巧和方法。 ... [详细]
  • 本文总结了Java中日期格式化的常用方法,并给出了示例代码。通过使用SimpleDateFormat类和jstl fmt标签库,可以实现日期的格式化和显示。在页面中添加相应的标签库引用后,可以使用不同的日期格式化样式来显示当前年份和月份。该文提供了详细的代码示例和说明。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 本文讨论了Kotlin中扩展函数的一些惯用用法以及其合理性。作者认为在某些情况下,定义扩展函数没有意义,但官方的编码约定支持这种方式。文章还介绍了在类之外定义扩展函数的具体用法,并讨论了避免使用扩展函数的边缘情况。作者提出了对于扩展函数的合理性的质疑,并给出了自己的反驳。最后,文章强调了在编写Kotlin代码时可以自由地使用扩展函数的重要性。 ... [详细]
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
  • WhenIusepythontoapplythepymysqlmoduletoaddafieldtoatableinthemysqldatabase,itdo ... [详细]
  • 【shell】网络处理:判断IP是否在网段、两个ip是否同网段、IP地址范围、网段包含关系
    本文介绍了使用shell脚本判断IP是否在同一网段、判断IP地址是否在某个范围内、计算IP地址范围、判断网段之间的包含关系的方法和原理。通过对IP和掩码进行与计算,可以判断两个IP是否在同一网段。同时,还提供了一段用于验证IP地址的正则表达式和判断特殊IP地址的方法。 ... [详细]
  • 这篇文章主要介绍了Python拼接字符串的七种方式,包括使用%、format()、join()、f-string等方法。每种方法都有其特点和限制,通过本文的介绍可以帮助读者更好地理解和运用字符串拼接的技巧。 ... [详细]
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社区 版权所有