调用opencv相关函数,从视频流中提取出图片序列

/************************
@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();
}

  

时间: 2024-10-17 14:26:38

调用opencv相关函数,从视频流中提取出图片序列的相关文章

opencv学习之基于背景提取等目标跟踪算法#20190704

/* *********************************************************************************************************************** 任务目标: 基于背景提取的目标跟踪算法实践及代码分析. ***************************************************************************************************

Linux shell中提取文件名和目录名的一些方法

很多时候在使用Linux的shell时,我们都需要对文件名或目录名进行处理,通常的操作是由路径中提取出文件名,从路径中提取出目录名,提取文件后缀名等等.例如,从路径/dir1/dir2/file.txt中提取也文件名file.txt,提取出目录/dir1/dir2,提取出文件后缀txt等. 下面介绍两种常用的方法来进行相关的操作. 一.使用${} 1.${var##*/} 该命令的作用是去掉变量var从左边算起的最后一个'/'字符及其左边的内容,返回从左边算起的最后一个'/'(不含该字符)的右边

从编译器源代码中提取ARMv8的指令编码

2012年11月份的资料,之前ARMv8手冊还没公布,我想办法从编译器的binutils中提取出了全部ARMv8指令的二进制编码,之前不能随便发,如今相当于解禁了^_^. 问题1:提取ARMv8的指令编码 答:ARMv8指令的opcode能够在支持ARMv8的编译器binutils中找到,该工具能在网上找到,见參考资料[1],或者在[1]中搜索aarch64_opcode_table. 为了说明指令编码细节.现将网页中部分内容摘录例如以下: 1208 struct aarch64_opcode 

从全域名中提取根域名

1.前言 最近因为工作需要判断一个域名是否备案,实际提取的域名就是HTTP报文中的Host的内容,而判断一个域名是否是根据根域名进行的.例如访问www.qq.com,提取Host的内容为www.qq.com,而判断这个域名是否备案,是通过qq.com进行,因此需要从Host内容中提取出根域名. 遇到的问题 1.顶级域名的种类存在以下不同情况,例如 www.google.com    www.google.com.cn 顶级域名分别是.com 和.com.cn提取顶级名分别为google.com

软件设计的切入点是什么?如何从最初的需求提取出一个粗粒度的软件结构?

一切设计的切入点是什么呢?我们必须从最初的需求和约束条件的混沌中提取出一个粗粒度的软件结构,然后再把它划分为构成待开发系统的有实际意义的各个部分,这就形成了一个清晰的初期概念设计,并形成一种理性.深入.细腻及智慧的设计风格. "顶层架构设计"相关模式的思维导图如下. 分布式系统模式语言的根模式和切入点.这些模式有助于我们从最初的需求和约束条件的混沌中提取出一个粗粒度的软件结构,然后再把它划分为构成待开发系统的有实际意义的各个部分. 1)凭直觉设计容易形成大泥球 要设计出可持续软件,必须

try ,finally都抛出异常如何处理.如果try中抛出了异常,在控制权转移到调用栈上一层代码之前, finally 语句块也会执行,如果finally抛出异常,try语句快抛出的那个异常就

package com.github.jdk7; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * try ,finally都抛出异常如何处理.如果try中抛出了异常,在控制权转移到调用栈上一层代码之前, * finally 语句块也会执行,如果finally抛出异常,try语句快抛出的那个异常就丢失了. * * @author doctor * * @since 2014年

matlab和C/C++混合编程--调用opencv

最近的我们已经将整个项目搭起来了,项目比较复杂.由于我们做的是检索系统,所以我们用asp.net(c#)做了网页,但是算法的实现是在matlab下,所以我们不得不用matlab生成动态链接库dll,然后用c#调用matlab,单单这个配置问题就搞了我们一个多星期,不过还是顺利解决了,解决方法以后有时间再写个博客出来. 虽然我们整个项目已经能在c#下跑通了,但是检索效果真不理想,检查各种可能出现问题的地方,首先自然是特征的问题.我们做的是偏图像的检索,有些现成的特征提取算法是在opencv下实现的

Atitit 图像处理 调用opencv 通过java &#160;api &#160;&#160;attilax总结

Atitit 图像处理 调用opencv 通过java  api   attilax总结 1.1. Opencv java api的支持 opencv2.4.2 就有了对java api的支持1 1.2. 安装2016-05-19  opencv v2.4.13   267M  ,一个压缩包解压即可1 1.3. Opencv d java 接口api  ,把opencv-2413.jar加入java项目1 1.4. /AtiPlatf_ee/src/com/attilax/img/SfitTes

java 在centos6.5+eclipse环境下调用opencv实现sift算法

java 在centos6.5+eclipse环境下调用opencv实现sift算法,代码如下: import org.opencv.core.Core; import org.opencv.core.Mat; import org.opencv.core.MatOfKeyPoint; import org.opencv.highgui.Highgui; import org.opencv.features2d.*; public class ExtractSIFT{ public static