基础学习笔记之opencv(6):实现将图片生成视频
基础学习笔记之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代码:

// generate_vedio.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <stdio.h>
#include <iostream> using namespace cv;
using namespace std; int main(int argc, unsigned char* argv[])
{
String str_name="WavingTrees/b00";
char str[4]; Mat img_src,img_dst;
vector<Mat> img_gray; img_src=imread("WavingTrees/b00000.bmp"); //使用VideoWriter时,假设须要写视频的文件不存在,则新建一个。假设存在,则必须是合法的视频文件。否则以下的语句会报错
//假设选择PIM1格式时,输出视频的帧率不能手动选择。且输出视频效果非常糟糕
//VideoWriter output_src("demo_src.avi",CV_FOURCC('P','I','M','1'),2,img.size(),1);//输出彩色视频
//VideoWriter output_dst("demo_dst.avi",CV_FOURCC('P','I','M','1'),25,img.size(),0);//输出灰度视频 //当用MJPG格式时,能够选择输出的帧率,且视频输出的效果也要好非常多,所以一般採用这样的格式输出
//最后一个參数isColor假设为非0的话,则表示输出3通道彩色视频。否则当isColor=0时输出为单通道黑白灰度视频
//只是此时当放入视频的图片为单通道图片时,输出的视频尽管是黑白灰度的,但是确同一时候有3幅图出现,即宽度压缩了3倍
VideoWriter output_src("demo_src.avi",CV_FOURCC('M','J','P','G'),10,img_src.size(),1);//输出灰度视频
VideoWriter output_dst("demo_dst.avi",CV_FOURCC('M','J','P','G'),10,img_src.size(),1);//输出灰度视频 int i=-1; namedWindow("src",WINDOW_AUTOSIZE);
while(1)
{
i++; /****图片名字读取前的处理****/
_itoa_s(i,str,10);
if(i<10)
str_name+="00";
else if(i<100)
str_name+="0";
str_name+=str;
str_name+=".bmp";
if(256==i)
return 0; /****输出原彩色视频****/
img_src=imread(str_name);
if(img_src.empty())
return 0;
output_src<<img_src; /****输出目标灰色视频****/
//这里用split函数的目的是为了给vector<Mat>型变量确定边界,假设没有此语句。
//则以下使用img_gray[1]就会觉得是错误的
split(img_src,img_gray);
cvtColor(img_src,img_gray[1],CV_BGR2GRAY);//这样输出的是彩色视频
//假设其他通道赋0的话,不是真正意义上的黑白灰度图,而是背景为蓝色的灰度图
// img_gray[0]=img_gray[2]=Mat::zeros(img_src.size(),img_gray[1].type());
img_gray[0]=img_gray[2]=img_gray[1];//这样赋值才是真正意义上的黑白灰度图
merge(img_gray,img_dst); //但这样输出的尽管是灰度视频,但是一副图像中包括了3个一样图,即图像宽度被压缩了3倍,why?
//且此时不能输出3通道的图片,否则生成的视频不能播放
output_dst<<img_dst;
// output_dst<<img; imshow("src",img_src); /****延时处理****/
char c=(char)waitKey(10);
if(27==c)
return 0; str_name="WavingTrees/b00";
} return 0;
}

基础学习笔记之opencv(6):实现将图片生成视频的更多相关文章
- 基础学习笔记之opencv(24):imwrite函数的使用
http://www.cnblogs.com/tornadomeet/archive/2012/12/26/2834336.html 前言 OpenCV中保存图片的函数在c++版本中变成了imwrit ...
- 基础学习笔记之opencv(3):haartraining生成.xml文件过程[转]
1.准备正负样本: 在上一讲http://www.cnblogs.com/tornadomeet/archive/2012/03/27/2420088.html 中,我们已经收集到了训练所用的正样本. ...
- opencv学习笔记(六)直方图比较图片相似度
opencv学习笔记(六)直方图比较图片相似度 opencv提供了API来比较图片的相似程度,使我们很简单的就能对2个图片进行比较,这就是直方图的比较,直方图英文是histogram, 原理就是就是将 ...
- 【C#编程基础学习笔记】4---Convert类型转换
2013/7/24 技术qq交流群:JavaDream:251572072 教程下载,在线交流:创梦IT社区:www.credream.com [C#编程基础学习笔记]4---Convert类型转换 ...
- 【C#编程基础学习笔记】6---变量的命名
2013/7/24 技术qq交流群:JavaDream:251572072 教程下载,在线交流:创梦IT社区:www.credream.com [C#编程基础学习笔记]6---变量的命名 ----- ...
- 1.C#基础学习笔记3---C#字符串(转义符和内存存储无关)
技术qq交流群:JavaDream:251572072 教程下载,在线交流:创梦IT社区:www.credream.com ------------------------------------- ...
- Java基础学习笔记总结
Java基础学习笔记一 Java介绍 Java基础学习笔记二 Java基础语法之变量.数据类型 Java基础学习笔记三 Java基础语法之流程控制语句.循环 Java基础学习笔记四 Java基础语法之 ...
- Mysql数据库基础学习笔记
Mysql数据库基础学习笔记 1.mysql查看当前登录的账户名以及数据库 一.单表查询 1.创建数据库yuzly,创建表fruits 创建表 ) ) ,) NOT NULL,PRIMARY KEY( ...
- 0003.5-20180422-自动化第四章-python基础学习笔记--脚本
0003.5-20180422-自动化第四章-python基础学习笔记--脚本 1-shopping """ v = [ {"name": " ...
随机推荐
- 2.搭建配置最简单的spring mvc 工程-基础版
目标:用最少的东西,搭建可以运行的最最基础的springMvc登陆校验项目! spring 4 1.首先配置pom.xml引入spring 相关jar, 引用都有注释, 无关的可以暂时不引用. < ...
- HTTP 状态消息 [转]
转自:https://www.cnblogs.com/wuyongyu/p/5745875.html HTTP 状态消息 ...
- Linux下Shell脚本字符串单引号、双引号、反引号、反斜杠的作用和区别
一.单引号 str='this is a string' 单引号字符串的限制: 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的: 单引号字串中不能出现单引号(对单引号使用转义符后也不行) ...
- 图解sql server 命令行工具sqlcmd的使用
http://blog.csdn.net/bcbobo21cn/article/details/52260733
- RequireJS解决代码依赖问题,异步加载js,避免页面失去相应
RequireJS的目标是鼓励代码的模块化,它使用了不同于传统<script>标签的脚本加载步骤.可以用它来加速.优化代码,但其主要目的还是为了代码的模块化.它鼓励在使用脚本时以modul ...
- JavaScript中的普通函数和箭头函数
最近被问到了一个问题: javaScript 中的箭头函数 ( => ) 和普通函数 ( function ) 有什么区别? 我当时想的就是:这个问题很简单啊~(flag),然后做出了错误的回答 ...
- Mac OS X上使用Wireshark抓包
Wireshark针对UNIX Like系统的GUI发行版界面采用的是X Window(1987年更改X版本到X11).Mac OS X在Mountain Lion之后放弃X11,取而代之的是开源的X ...
- Copy Records From One Data Block To Another Data Block In Oracle Forms
In this tutorial you will learn to copy the records from one data block to another data block on sam ...
- 卸载django
首先找到django安装路径 Python import sys; sys.path = sys.path[1:]; import django; print(django.__path__) 得到 ...
- Android设计模式之中的一个个样例让你彻底明确装饰者模式(Decorator Pattern)
导读 这篇文章中我不会使用概念性文字来说明装饰者模式.由于通常概念性的问题都非常抽象.非常难懂.使得读者非常难明确究竟为什么要使用这样的设计模式.我们设计模式的诞生,肯定是前辈们在设计程序的时候遇到了 ...