/************************
@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. IntelliJ IDEA 构建maven多模块项目

    我们在开发中 因为项目之间需要依赖 所以会在maven创建多个项目配置依赖,这种项目结构主要应用在大型项目中,多人协作开发 1.创建一个项目 File ->NEW -> Projec 2. ...

  2. 简单快捷使用Git

    1.简介和安装Git是世界上目前最先进的分布式版本控制系统.安装:https://git-for-windows.github.io下载.设置姓名和email:git config --global ...

  3. PHP判断是手机端还是PC访问

    function isMobile(){ $useragent=isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : ' ...

  4. NetBeans 代码折叠

    代码折叠 // <editor-fold>   Your code goes here...// </editor-fold> 添加描述 // <editor-fold ...

  5. Java中锁的实现与内存语义

    目录 1. 概述 2. 锁的内存语义 3. 锁内存语义的实现 4. 总结 1. 概述 锁在实际使用时只是明白锁限制了并发访问, 但是锁是如何实现并发访问的, 同学们可能不太清楚, 下面这篇文章就来揭开 ...

  6. week06 12 我们准备数据 前端调用rpc 前后端联调一下

    用postman发送请求 出现一个问题 我在return结果前 要将数据转换成字典 所以我们用json.dumps()后再json.load()回来 这样就避免了这个问题 因为数据结构的数据 比如li ...

  7. 【前言】Go语言开坑

    很早之前就已经听过Go语言的大名,今天终于要开坑研究Go了,来吧看看<Go语言从入门到入坟>. [Go语言学习目录] 1. Go安装 2. Go变量(Variables) 3. Go语言基 ...

  8. TZOJ 4244 Sum(单调栈区间极差)

    描述 Given a sequence, we define the seqence's value equals the difference between the largest element ...

  9. 396. Rotate Function 移动加权求和,取最大值

    [抄题]: Given an array of integers A and let n to be its length. Assume Bk to be an array obtained by ...

  10. mybatis pagehelper分页插件使用

    使用过mybatis的人都知道,mybatis本身就很小且简单,sql写在xml里,统一管理和优化.缺点当然也有,比如我们使用过程中,要使用到分页,如果用最原始的方式的话,1.查询分页数据,2.获取分 ...