/************************
@HJ 2017/3/30 参考http://blog.sina.com.cn/s/blog_4b0020f301010qcz.html修改的代码
@主要调用opencv相关函数,从视频流中提取出图片序列
@需要注意的问题:
cvReleaseImage(&pImg)释放内存出错的两种情况:具体可以参考http://www.cnblogs.com/grandyang/p/4615036.html
1)从摄像头获取的图片不能被修改和释放,所以如果我们对捕获的图像调用cvReleaseImage就会出错
2)使用完了CvCapture,需要用cvReleaseCapture来释放内存,那么我们就不需要再用cvReleaseImage来释放每一张图像的内存了
******************************/ #include <opencv2\opencv.hpp>
#include <highgui.h>
#include <iostream>
#include <io.h>//for _acess()
#include <string> const int picNum = 25;//设置所想要的图片序列数量
char* videoName1 = "C:\\TEST\\opencv\\V2P2V\\V2P2V\\V2P2V\\1.wmv";//输入的视频绝对路径
char* outDir1 = "C:\\TEST\\opencv\\V2P2V\\V2P2V\\V2P2V\\img\\";//输出图像的绝对路径 int VideoToImage(char* videoName, char* outDir, char* imgExt, int picNum);//视频转化为图片序列MaxFrameCount可以填写你想需要的图片序列格式 //将视频转换为图片序列 返回由视频分解得到的图片总帧数
int VideoToImage(char* videoName, char* outDir, char* imgExt, int picNum)
{
CvCapture *cap = cvCaptureFromFile(videoName);
if (cap == NULL)
{
return 0;
}
if (_access(outDir, 0) == -1)
{
std::cout << "the ouput directory does not exist!" << std::endl;
cvWaitKey();
} char cur_fn[255];//保存当前帧所得图片的文件名
IplImage* pImg = NULL;
int frame = 0;
while ((pImg = cvQueryFrame(cap)) != NULL && (frame<picNum))
{
frame++;
strcpy(cur_fn, "");
sprintf(cur_fn, "%s%d%s", outDir, frame, imgExt);//将outDir, frame, imgExt三个数据拼接然后放在cur_fn中
cvSaveImage(cur_fn, pImg, NULL);
} //cvReleaseImage(&pImg);//从摄像头获取的图片不能被修改和释放,所以如果我们对捕获的图像调用cvReleaseImage就会出错
cvReleaseCapture(&cap); return 1;
} int main(){
//视频转图片
if (int images = VideoToImage(videoName1, outDir1, ".jpg", picNum)){//输入的视频绝对路径、输出图像的绝对路径、存储图像的格式.jpg,图像序列数据
std::cout << "ALL pictures have been extracted from the video." << std::endl;
}
else std::cout << "the work is failed." << std::endl;
cvWaitKey();
}

 ---------------------------------------------------------------------------------------------------------------------------------------------------------------

jpg图片序列,转化成avi格式视频: 

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
#include <io.h> using namespace cv;
using namespace std; //将图片序列转换为视频,返回视频帧数 目前OpenCV只支持输出AVI格式的视频
int ImageToVideo(char* outDir, char* videoName, char* inputDir, int startFrame, int endFrame, int imgW, int imgH, char* imgExt, double fps, int isColor, int fourcc)
{ //判断输入文件夹是否存在
if (_access(inputDir, 0) == -1)
{
std::cout << "the input directory does not exist!" << std::endl;
return 0;
} //判断输出文件夹是否创建若没有则创建;若为NULL则默认当前工作目录
char fullVideoName[255];//输出视频的完整文件名:路径+文件名
strcpy(fullVideoName, "");
if (outDir == NULL)
{
sprintf(fullVideoName, "%s", videoName);
} int frameCount = 0;
CvVideoWriter *pWriter = NULL;
CvSize size = cvSize(imgW, imgH);
pWriter = cvCreateVideoWriter(videoName, fourcc, fps, size, isColor);//CREATE WRITER IplImage *pImg = NULL;
char cur_fn[255];//表示某张图片的路径
while (startFrame <= endFrame)
{
strcpy(cur_fn, "");
sprintf(cur_fn, "%s%d%s", inputDir, startFrame, imgExt);//need to change pImg = cvLoadImage(cur_fn, isColor);
if (!pImg)
{
std::cout << "can't open an image file" << std::endl;
return frameCount;
}
cvWriteFrame(pWriter, pImg);
cvWaitKey(1); std::cout << "Write frame " << startFrame << std::endl;
startFrame++; cvReleaseImage(&pImg); frameCount++;
}
cvReleaseVideoWriter(&pWriter); rename(videoName, fullVideoName);//移动文件到指定文件夹
return frameCount;
} int main() { //将从摄像头中读到的图像序列转换为.avi视频
//VideoCapture capture(0);
//VideoWriter writer("VideoTest.avi", CV_FOURCC('M', 'J', 'P', 'G'), 25.0, Size(640, 480));
//Mat frame; //while (capture.isOpened())
//{
// capture >> frame;
// writer << frame;
// imshow("video", frame);
// if (cvWaitKey(20) == 27)
// {
// break;
// }
//}
char* outDir = "C:\\TEST\\opencv\\video2pic\\viedo2pic\\viedo2pic\\img\\";
char* videoName = "110.avi";
char* inputDir = "C:\\TEST\\opencv\\video2pic\\viedo2pic\\viedo2pic\\img\\";
int startFrame =1;
int endFrame = 100;
int imgW = 320;
int imgH = 240;
char* imgExt=".jpg";
double fps = 15; ImageToVideo( outDir, videoName, inputDir, startFrame, endFrame, imgW, imgH, imgExt, fps, 1, CV_FOURCC('D', 'I', 'V', 'X'));
return 0;
}

  

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

  1. psfgettable - 从控制台字体中提取出嵌入的Unicode字符表

    总览 psfgettable 字体文件 [输出文件] 描述 psfgettable 命令从一个 .psf 格式的控制台字体中提取出嵌入的 Unicode字符表, 以易读格式输入到一个ASCII文件, ...

  2. opencv实例三:播放AVI格式视频

    一.不带滚动条的视频读取播放. 1.原理介绍:视频的本质是一些静态的图像的集合,opencv可以不断读取视屏中的图片,显示,就可以实时的视频流进行处理了. 2.代码如下: /************* ...

  3. 从.src.rpm包中提取出完整的源码的方法

    1 什么是完整的源码 就是说,最初始的源码加上打了所有的patch后的源码,即最新的源码. 2 过程 2.1 从.src.rpm中提取完整的rpm工程文件 2.1.1 rpm to cpio rpm2 ...

  4. 从fasta中提取或者过滤掉多个序列

    Google了一下,现成的工具不多. 自己写代码也可以,就是速度肯定不快,而且每次写也很麻烦. 偶然看到QIIME的filter_fasta.py有这个功能,从name list中提取多个序列. fi ...

  5. 关于ucos操作系统中如何从邮箱中提取出消息

    问题提出? 定义两个任务,task1,task2,想task1用OSMboxPost,task2用OSMboxPend定义了一个邮箱Mbox1=OSMboxCreate(括号里面应该怎么写?)还有具体 ...

  6. 怎么从bam文件中提取出比对OR没比对上的paired reads | bamToFastq | STAR

    折腾这么多都是白瞎,STAR就有输出没有别对上的pair-end reads的功能 参见:How To Filter Mapped Reads With Samtools I had the same ...

  7. 论文系统Step1:从日志记录中提取特定信息

    论文系统Step1:从日志记录中提取特定信息 前言 论文数据需要,需要实现从服务器日志中提取出用户的特定交互行为信息.日志内容如下: 自己需要获取"请求数据包一行的信息"及&quo ...

  8. [SQL] 从文本中提取数值

    现需求从上方测试数据的“备注”列中提取出金额 目前有两个方法比较容易实现: 1.首先比较容易想到的就是利用函数stuff删除掉所有的非数值字符. STUFF ( character_expressio ...

  9. sublime在混杂的log数据中提取你想要的内容

    前几天因为同事一个sql写的有问题,导致我这边处理mysql入库出现数据丢失,没什么办法啊,为了回复数据,只能去翻前两天的log了,但是怎么从十几个几十兆的文件中找到我们需要的数据然后提取出来呢,我的 ...

随机推荐

  1. 新部署tomcat,An error occurred at line: [1] index_jsp.java

    环境: centos6.5 32位 oracle jdk 1.8 tomcat 7 问题: yum install tomcat后,返回如下错误: [root@centos]~# curl -v ht ...

  2. 第二篇*1、Python基本数据类型

    数据类型: 变量可以处理不同类型的值,基本的类型是数和字符串.使用变量时只需要给它们赋一个值.不需要声明或定义数据类型.Python3 中有六个标准的数据类型:Number(数字),String(字符 ...

  3. cxGrid类似pagecontrol的效果

    1.对TcxGrid创建多个Level 2.对TcxGrid的TcxGridLevelOptions的TabsForEmptyDetail设置为True 3.再设置DetailTabsPosition ...

  4. [Ting's笔记Day4]将Ruby on Rails项目部署到Heroku

    今天想笔记的是把自己写的Ruby on Rails项目部署(Deploy)到Heroku! Heroku是Salesforce公司旗下的云端服务商,支持多种程序语言像是Ruby,PHP,Python等 ...

  5. 《CSAPP》 可重定位目标文件格式

    可重定位目标文件 ELF文件 ELF头以一个16字节的序列开始,这个序列描述了生成该文件的系统的字的大小和字节顺序.ELF头剩下的部分包含帮助链接器语法分析和解释目标文件的信息.其中包括ELF头的大小 ...

  6. Python设计模式 - 基础 - 七大基本原则

    提倡使用设计模式,主要出发点就是实现代码复用,增加代码的扩展性和可维护性.如何设计出简洁.易懂.灵活.优美的代码结构的确是一门学问,透彻理解并践行如下七大原则通常都能取得基本满意的结果: - 单一职责 ...

  7. python argparse(参数解析)模块学习(二)

    转载自:http://www.cnblogs.com/fireflow/p/4841389.html(我去..没转载功能,ctrl + c 和 ctrl + v 得来的,格式有点问题,可去原版看看) ...

  8. vue 根据接口返回的状态码判断用户登录状态并跳转登录页,登录后回到上一个页面(http拦截器)

    背景:后台接口返回code==501表示用户是未登录状态,需要登录才可访问: 通过http拦截做路由跳转 第一步:src目录下新建http.js文件,内容如下: import Axios from ' ...

  9. VUE项目小试牛刀

    首先安装webstorm:http://www.jetbrains.com/webstorm/  (推荐) 再安装node.js:https://nodejs.org/en/download/  (必 ...

  10. LinkedList 源码实现

    闲暇之余,准备将Java 一些常用的数据结构进行重新的剖析,并记录博客比如LinkedList ,HashMap ,HashTable ,以及并发包所引入的集合,在博客中会陆续更新 start 哈哈, ...