基础学习笔记之opencv:实现将图片生成视频
Posted jzssuanfa
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基础学习笔记之opencv:实现将图片生成视频相关的知识,希望对你有一定的参考价值。
基础学习笔记之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:实现将图片生成视频的主要内容,如果未能解决你的问题,请参考以下文章
以代码为基础的opencv-python学习 图片的加载以及视频展示
android ndk之opencv+MediaCodec硬编解码来处理视频动态时间水印