我们在计算机视觉相关的实验中都需要视频与图片序列之间相互转换,在平时的实验中,经常需要将视频保存为一帧一帧的图片,以获取实验结果;另一方面,很多标准的算法测试数据库都是图片序列(文件名以帧号+图片扩展名),我们可能需要将其转换为视频,因此视频与图片之间的转换是很常见的操作。在网上找到比较好的测试程序,一方面将其封装为函数,方便调用;另一方面,视频转图片可以任意设定图片输出目录,函数会自动创建相关目录;图片序列转视频可以设定更多的参数,也就可以更好的控制,而且可以自行设定视频输出的目录,函数自动检测并创建相关目录。适合windows平台+OpenCV;

代码如下:

 
  1 // ImgToVideo_test.cpp : Defines the entry point for the console application.
2 //
3
4 #include "stdAfx.h"
5 #include <cv.h>
6 #include <highgui.h>
7 #include <iostream>
8 #include <direct.h>//for mk_dir
9 #include <io.h>//for _acess()
10 #include <string>
11
12 int recursive_mkdir( char *dir );//创建多级目录
13 int ImageToVideo(char* outDir,char* videoName,char* inputDir,int startFrame,int endFrame, int imgW,
14 int imgH,char* imgExt,double fps,int isColor,int fourcc);//图片序列转化为视频
15 int VideoToImage(char* videoName,char* outDir,char* imgExt,int maxFrameCount);//视频转化为图片序列
16
17
18 int main(int argc, char** argv)
19 {
20 //图片转视频F:\carrdisp_test\origin
21 char* inputDir="F:\\carrdisp_test1\\colorfore\\";
22 char* videoName="carrdisp_clofr.avi";
23 char* outDir="F:\\carrdisp_test1\\colorfore\\";
24 int frames=ImageToVideo(outDir,videoName,inputDir,2,308,448,336,"_Fr.jpg",24,1,CV_FOURCC('X','V','I','D'));
25 std::cout<<"total frames "<<frames<<" have been write to video."<<std::endl;
26 int p;
27 std::cin>>p;
28
29 return 0;
30 }
31
32 //将图片序列转换为视频,返回视频帧数
33 int ImageToVideo(char* outDir,char* videoName,char* inputDir,int startFrame,int endFrame, int imgW,int imgH,char* imgExt,double fps=24,int isColor=1,int fourcc=CV_FOURCC('X','V','I','D'))
34 {
35 //判断输入文件夹是否存在
36 if (_access(inputDir,0)==-1)
37 {
38 std::cout<<"the input directory does not exist!"<<std::endl;
39 return 0;
40 }
41 //判断输出文件夹是否创建 若没有则创建;若为NULL则默认当前工作目录
42 char fullVideoName[255];//输出视频的完整文件名:路径+文件名
43 strcpy_s(fullVideoName,"");
44 if (outDir==NULL)
45 {
46 sprintf_s(fullVideoName,"%s",videoName);//把videoName打印成一个字符串保存在fullVideoName 中
47 }
48 else
49 {
50 if (_access(outDir,0)==-1)
51 {
52 recursive_mkdir(outDir);
53 }
54 sprintf_s(fullVideoName,"%s%s",outDir,videoName);//将字符串outDir和videoName连接起来,打印,保存在fullVideoName中
55 }
56 int frameCount=0;
57 CvVideoWriter *pWriter=NULL;
58 CvSize size=cvSize(imgW,imgH);
59 pWriter=cvCreateVideoWriter(videoName,fourcc,fps,size,isColor);//CREATE WRITER
60
61 IplImage *pImg=NULL;
62 char cur_fn[255];//表示某张图片的路径
63 while(startFrame<=endFrame)
64 {
65 strcpy_s(cur_fn,"");
66 sprintf_s(cur_fn,"%s%d%s",inputDir,startFrame,imgExt);//need to change
67 pImg=cvLoadImage(cur_fn,isColor);
68 if (!pImg)
69 {
70 std::cout<<"can't open an image file"<<std::endl;
71 return frameCount;
72 }
73 cvWriteFrame(pWriter,pImg);
74 cvWaitKey(1);
75 std::cout<<"Write frame "<<startFrame<<std::endl;
76 startFrame++;
77 cvReleaseImage(&pImg);
78 frameCount++;
79 }
80 cvReleaseVideoWriter(&pWriter);
81 rename(videoName,fullVideoName);//移动文件到指定文件夹
82 return frameCount;
83 }
84 //将视频转换为图片序列 返回由视频分解得到的图片总帧数 目前OpenCV只支持AVI格式 因此使用之前需要
85 //将视频转化问AVI格式
86
87 int VideoToImage(char* videoName,char* outDir,char* imgExt,int maxFrameCount)
88 {
89 CvCapture *cap= cvCaptureFromFile(videoName);
90 if (cap==NULL)
91 {
92 return 0;
93 }
94 //保存图片的文件夹路径一定要有,因为OpenCV不会自动创建文件夹
95 if (_access(outDir,0)==-1)
96 {
97 recursive_mkdir(outDir);
98 std::cout<<"the ouput directory does not exist, and the have been created autonomously!"<<std::endl;
99 }
100 char cur_fn[255];//保存当前帧所得图片的文件名
101 IplImage* pImg=NULL;
102 int frame=0;
103 while((pImg=cvQueryFrame(cap))!=NULL&&(frame<maxFrameCount))
104 {
105 frame++;
106 strcpy_s(cur_fn,"");
107 sprintf_s(cur_fn,"%s%d%s",outDir,frame,imgExt);//这里的设置适合形如 123.jpg 124.jpg的图片序列
108 cvSaveImage(cur_fn,pImg,NULL);
109 }
110 cvReleaseImage(&pImg);
111 cvReleaseCapture(&cap);
112 return frame;
113 }
114
115
116 //该函数借鉴了网上资料,自动创建多级目录
117 int recursive_mkdir( char *dir )
118 {
119 //分解路径名E:\\AA\\BB\\CC\\
120 //
121 std::string str = dir;
122 int index = 0;
123 int i = 0;
124 while(1)
125 {
126 std::string::size_type pos = str.find("\\",index);
127 std::string str1;
128 str1 = str.substr(0,pos);
129 if( pos != -1 && i > 0 )
130 {
131 if (_access(str1.c_str(),0)==-1)
132 {
133 _mkdir(str1.c_str());
134 }
135 }
136 if( pos==-1 )
137 {
138 break;
139 }
140 i ++;
141 index = pos+1;
142 }
143 return 0;
144 }
 

上面程序在VS2010+opencv2.3.1+windows XP环境下测试通过,使用时注意设置好开始帧,结束帧,图片格式即可。本人图片目录如:

F:\carrdisp_test1\colorfore\2_Fr.jpg

其中只调用了图片序列写为视频的函数,另一个函数调用方法相似,如下举例:

 
  //视频转图片
char* videoName1="E:\\VIDEOS\\TEST\\Videos\\woman.avi";
char* outDir1="E:\\VIDEOS\\TEST\\Sequences\\WoemenSequence\\";
int images=VideoToImage(videoName1,outDir1,".jpg",200);
std::cout<<"total frames have been extracted from video."<<std::endl;
int p;
std::cin>>p;
 

OpenCV 视频与图片序列相互转换的更多相关文章

  1. 调用opencv相关函数,从视频流中提取出图片序列&&&&jpg图片序列,转化成avi格式视频

    /************************ @HJ 2017/3/30 参考http://blog.sina.com.cn/s/blog_4b0020f301010qcz.html修改的代码 ...

  2. 【小工具系列】Python + OpenCV 图片序列转换成视频

    图片序列转换成视频 最近一直在找一个工具,能够将一堆图片转化成视频.网上找了一些小软件,还有 win10 的照片自带的视频制作功能,都不是很满意. 又不想下载那些专业的视频剪辑软件大材小用. 然后找到 ...

  3. matlab下将图片序列转化为视频文件 && 将为视频文件转化图片序列

    将图片序列转化为视频文件 程序如下: framesPath = 'E:\img\';%图像序列所在路径,同时要保证图像大小相同 videoName = 'Bolt.avi';%表示将要创建的视频文件的 ...

  4. Python+Opencv实现把图片转为视频

    1. 安装Opencv包 在Python命令行输入如下命令(如果你使用的Anaconda,直接进入Anaconda Prompt键入命令即可.如果你不知道Anaconda是什么,可以参考王树义老师的文 ...

  5. OpenCV视频读取播放,视频转换为图片

    转载请注明出处!!! http://blog.csdn.net/zhonghuan1992 OpenCV视频读取播放,视频转换为图片 介绍几个有关视频读取的函数: VideoCapture::Vide ...

  6. opencv 视频处理相关

    包含视频格式知识(编解码和封装格式):如何获取视频信息及视频编解码格式:opencv读取及保存视频,及opencv fourcc编码格式 一.基础知识 视频的编解码格式和封装格式 参考如山似水 视频编 ...

  7. 仿照微信的效果,实现了一个支持多选、选原图和视频的图片选择器,适配了iOS6-9系统,3行代码即可集成.

    提示:如果你发现了Bug,请尝试更新到最新版.目前最新版是1.6.4,此前的版本或多或少存在一些bug的~如果你已经是最新版了,请留一条评论,我看到了会尽快处理和修复哈~ 关于升级iOS10和Xcdo ...

  8. 怎么样用opencv将彩色图片转化成像素值只有0和255的灰度图?

      分类: OpenCV [Q1]怎么样用opencv将彩色图片转化成像素值只有0和255的灰度图? 进行灰度化,IplImage* pImg = cvLoadImage( "C:\\1.b ...

  9. csharp通过dll调用opencv函数,图片作为参数

    [blog 项目实战派]csharp通过dll调用opencv函数,图片作为参数          ​一直想做着方面的研究,但是因为这个方面的知识过于小众,也是由于自己找资料的能力比较弱,知道今天才找 ...

随机推荐

  1. xpath中遇到[<Element a at 0x39a9a80>](转)

    Element是什么 回归正题,大家晕头转脑的看完繁杂的语法之后,已经迫不及待写点什么东西了,然后部分同学可能遇到了这个 <Element a at 0x39a9a80>或者类似 Elem ...

  2. Bootstrap 简介二

    什么是 Bootstrap? Bootstrap 是一个用于快速开发 Web 应用程序和网站的前端框架.Bootstrap 是基于 HTML.CSS.JAVASCRIPT 的. 历史 Bootstra ...

  3. CNN学习笔记:全连接层

    CNN学习笔记:全连接层 全连接层 全连接层在整个网络卷积神经网络中起到“分类器”的作用.如果说卷积层.池化层和激活函数等操作是将原始数据映射到隐层特征空间的话,全连接层则起到将学到的特征表示映射到样 ...

  4. HandlerSocket ---MySQL与NoSQL ---SQL与NoSQL的融合(转)

    项目地址:https://github.com/ahiguti/HandlerSocket-Plugin-for-MySQL 写这一篇内容的原因是MySQL5.6.2突然推出了memcached的功能 ...

  5. alias指令别名和 sshpass命令简化ssh登陆

     在之前的一篇博文中 ubuntu下关于profile和bashrc中环境变量的理解 提到过可以编辑bashrc文件,vim ~/.bashrc,来编写自己的小指令,就是给长指令取个简单的别名.比如b ...

  6. HTTP与服务器的四种交互方式

    Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE.URL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP ...

  7. ASP.NET的内置对象

    Request   该对象用于检索从浏览器向服务器所发送的请求中的信息.在按下“提交”按钮时,Request对象将读取和提取通过HTTP请求发送的参数.在用户提交表单时,包含在输入控件中的数据将与表单 ...

  8. maven 项目转 gradle

    打开maven 项目的根目录,CMD 执行命令:gradle init --type pom maven项目就变成了gradle项目

  9. 蓝屏代码大全 & 蓝屏全攻略

    转载自http://diybbs.zol.com.cn/15/86_141447.html 一.蓝屏含义 1.故障检查信息 ***STOP 0x0000001E(0xC0000005,0xFDE38A ...

  10. Android--第三方控件--okHttp

    Android中有很多的第三方控件,其中OkHttp是一个很强大的用于网络加载的第三方框架,当然了,它的内部也是使用原生的代码封装好的.今天我们就来看一下OkHttp的简单用法: 说到网络请求,肯定就 ...