基础学习笔记之opencv(6):实现将图片生成视频

 在做实验的过程中。难免会读视频中的图片用来处理,相反将处理好的图片又整理输出为一个视频文件也是非经常常使用的。

以下就来讲讲基于opencv的C++版本号中图片输出视频是怎么实现的。

  本次试验的数据为摇摆的树枝树叶图片,Waving Trees,其来源网址为: http://research.microsoft.com/en-us/um/people/jckrumm/WallFlower/TestImages.ht

  该数据全由bmp图片组成。

本次试验的project环境为:opencv2.3.1+vs2010

    实验功能:将多张bmp彩色图片生成一个avi格式的灰度视频文件。

在试验过程中。须要注意一下几点:

  1.输出视频文件命名的处理和视频帧率的选择

  2.输出视频文件格式的选择,好像opencv支持2种,一种是MIP1,和MJPG。

可是试验过程中发现假设选择MIP1不仅输出视频质量很差,且帧率不能控制。

  3.关于视频输出是否为彩色问题见代码凝视部分。

  以下是project代码:

  1. // generate_vedio.cpp : 定义控制台应用程序的入口点。
  2.  
  3. //
  4.  
  5. #include "stdafx.h"
  6.  
  7. #include <opencv2/core/core.hpp>
  8. #include <opencv2/highgui/highgui.hpp>
  9. #include <opencv2/imgproc/imgproc.hpp>
  10. #include <stdio.h>
  11. #include <iostream>
  12.  
  13. using namespace cv;
  14. using namespace std;
  15.  
  16. int main(int argc, unsigned char* argv[])
  17. {
  18. String str_name="WavingTrees/b00";
  19. char str[4];
  20.  
  21. Mat img_src,img_dst;
  22. vector<Mat> img_gray;
  23.  
  24. img_src=imread("WavingTrees/b00000.bmp");
  25.  
  26. //使用VideoWriter时,假设须要写视频的文件不存在,则新建一个。假设存在,则必须是合法的视频文件。否则以下的语句会报错
  27. //假设选择PIM1格式时,输出视频的帧率不能手动选择。且输出视频效果非常糟糕
  28. //VideoWriter output_src("demo_src.avi",CV_FOURCC('P','I','M','1'),2,img.size(),1);//输出彩色视频
  29. //VideoWriter output_dst("demo_dst.avi",CV_FOURCC('P','I','M','1'),25,img.size(),0);//输出灰度视频
  30.  
  31. //当用MJPG格式时,能够选择输出的帧率,且视频输出的效果也要好非常多,所以一般採用这样的格式输出
  32. //最后一个參数isColor假设为非0的话,则表示输出3通道彩色视频。否则当isColor=0时输出为单通道黑白灰度视频
  33. //只是此时当放入视频的图片为单通道图片时,输出的视频尽管是黑白灰度的,但是确同一时候有3幅图出现,即宽度压缩了3倍
  34. VideoWriter output_src("demo_src.avi",CV_FOURCC('M','J','P','G'),10,img_src.size(),1);//输出灰度视频
  35. VideoWriter output_dst("demo_dst.avi",CV_FOURCC('M','J','P','G'),10,img_src.size(),1);//输出灰度视频
  36.  
  37. int i=-1;
  38.  
  39. namedWindow("src",WINDOW_AUTOSIZE);
  40. while(1)
  41. {
  42. i++;
  43.  
  44. /****图片名字读取前的处理****/
  45. _itoa_s(i,str,10);
  46. if(i<10)
  47. str_name+="00";
  48. else if(i<100)
  49. str_name+="0";
  50. str_name+=str;
  51. str_name+=".bmp";
  52. if(256==i)
  53. return 0;
  54.  
  55. /****输出原彩色视频****/
  56. img_src=imread(str_name);
  57. if(img_src.empty())
  58. return 0;
  59. output_src<<img_src;
  60.  
  61. /****输出目标灰色视频****/
  62. //这里用split函数的目的是为了给vector<Mat>型变量确定边界,假设没有此语句。
  63. //则以下使用img_gray[1]就会觉得是错误的
  64. split(img_src,img_gray);
  65. cvtColor(img_src,img_gray[1],CV_BGR2GRAY);//这样输出的是彩色视频
  66. //假设其他通道赋0的话,不是真正意义上的黑白灰度图,而是背景为蓝色的灰度图
  67. // img_gray[0]=img_gray[2]=Mat::zeros(img_src.size(),img_gray[1].type());
  68. img_gray[0]=img_gray[2]=img_gray[1];//这样赋值才是真正意义上的黑白灰度图
  69. merge(img_gray,img_dst);
  70.  
  71. //但这样输出的尽管是灰度视频,但是一副图像中包括了3个一样图,即图像宽度被压缩了3倍,why?
  72. //且此时不能输出3通道的图片,否则生成的视频不能播放
  73. output_dst<<img_dst;
  74. // output_dst<<img;
  75.  
  76. imshow("src",img_src);
  77.  
  78. /****延时处理****/
  79. char c=(char)waitKey(10);
  80. if(27==c)
  81. return 0;
  82.  
  83. str_name="WavingTrees/b00";
  84. }
  85.  
  86. return 0;
  87. }
作者:tornadomeet 出处:http://www.cnblogs.com/tornadomeet 欢迎转载或分享,但请务必声明文章出处。 (新浪微博:tornadomeet,欢迎交流!

基础学习笔记之opencv(6):实现将图片生成视频的更多相关文章

  1. 基础学习笔记之opencv(24):imwrite函数的使用

    http://www.cnblogs.com/tornadomeet/archive/2012/12/26/2834336.html 前言 OpenCV中保存图片的函数在c++版本中变成了imwrit ...

  2. 基础学习笔记之opencv(3):haartraining生成.xml文件过程[转]

    1.准备正负样本: 在上一讲http://www.cnblogs.com/tornadomeet/archive/2012/03/27/2420088.html 中,我们已经收集到了训练所用的正样本. ...

  3. opencv学习笔记(六)直方图比较图片相似度

    opencv学习笔记(六)直方图比较图片相似度 opencv提供了API来比较图片的相似程度,使我们很简单的就能对2个图片进行比较,这就是直方图的比较,直方图英文是histogram, 原理就是就是将 ...

  4. 【C#编程基础学习笔记】4---Convert类型转换

    2013/7/24 技术qq交流群:JavaDream:251572072  教程下载,在线交流:创梦IT社区:www.credream.com [C#编程基础学习笔记]4---Convert类型转换 ...

  5. 【C#编程基础学习笔记】6---变量的命名

    2013/7/24 技术qq交流群:JavaDream:251572072  教程下载,在线交流:创梦IT社区:www.credream.com [C#编程基础学习笔记]6---变量的命名 ----- ...

  6. 1.C#基础学习笔记3---C#字符串(转义符和内存存储无关)

    技术qq交流群:JavaDream:251572072  教程下载,在线交流:创梦IT社区:www.credream.com ------------------------------------- ...

  7. Java基础学习笔记总结

    Java基础学习笔记一 Java介绍 Java基础学习笔记二 Java基础语法之变量.数据类型 Java基础学习笔记三 Java基础语法之流程控制语句.循环 Java基础学习笔记四 Java基础语法之 ...

  8. Mysql数据库基础学习笔记

    Mysql数据库基础学习笔记 1.mysql查看当前登录的账户名以及数据库 一.单表查询 1.创建数据库yuzly,创建表fruits 创建表 ) ) ,) NOT NULL,PRIMARY KEY( ...

  9. 0003.5-20180422-自动化第四章-python基础学习笔记--脚本

    0003.5-20180422-自动化第四章-python基础学习笔记--脚本 1-shopping """ v = [ {"name": " ...

随机推荐

  1. WinForm版聊天室复习Socket通信

    聊天室:服务器端-------------客户端 最终演示展示图: 一. 服务器端 对服务端为了让主窗体后台不处理具体业务逻辑,因此对服务端进行了封装,专门用来处理某个客户端通信的过程. 而由于通信管 ...

  2. DotnetBrowser入门教程-(1)浏览器控件使用

    先简单介绍下DotnetBrowser作为基本浏览器控件的使用: 1.创建基于.net 4.0的桌面项目,如下所示: 2.首次使用的时候在工具栏里添加dotnetbrowser控件,如下图所示: 3. ...

  3. Linux 线程浅析

    进程和线程的区别与联系 在许多经典的操作系统教科书中,总是把进程定义为程序的执行实例,它并不执行什么, 只是维护应用程序所需的各种资源,而线程则是真正的执行实体. 为了让进程完成一定的工作,进程必须至 ...

  4. 关于阿里 weex 的使用与案例

    1. 阿里宣布开源Weex http://mp.weixin.qq.com/s?__biz=MzA4MjA0MTc4NQ==&mid=504089541&idx=1&sn=3a ...

  5. java把一个文件的内容复制到另外一个文件

    /** * java把一个文件的内容复制到另外一个文件 */import java.io.File;import java.io.FileInputStream;import java.io.File ...

  6. IOS知识点收集

    17  duplicate symbols for architecture armv7s 用cocoapods 的时候出现,这种错误一般是由重复引用库文件引起. 原因:自己尝试添加Reachabil ...

  7. Oracle 在Drop表时的Cascade Constraints

    http://hi.baidu.com/rebooo/item/12b500b130022bf263388e69假设A为主表(既含有某一主键的表),B为从表(即引用了A的主键作为外键).则当删除A表时 ...

  8. css 使表格随着内容自动适应宽度

    所谓难而不会,会儿不难.这个问题让我纠结了很长时间,一句css解决了,仅仅靠一个属性 td { white-space: nowrap; }

  9. Lua学习一----------开发环境搭建

    © 版权声明:本文为博主原创文章,转载请注明出处 1.LuaDist下载地址:http://luadist.org/ 2.LuaRocks下载地址:https://github.com/luarock ...

  10. wampserver 安装多个php版本号报错之关键问题

    近期喜欢上用wampserver来搭建php本地执行环境 主要是一键安装 特easy 之前一直用的是 appserv 也挺好用的 用了wamp后 才发现wamp更好用 duang duang 默认下载 ...