批量解帧视频文件cpp
前言
将多个视频文件进行解帧。
实现过程
1.批量获取文件路径;
2.对某个视频文件进行解帧;
代码
/************************************************************************
* Copyright(c) 2017 ZRJ
* All rights reserved.
*
* File: video2frames.cpp
* Brief: 批量解帧视频文件
* Version: 1.0
* Author: ZRJ
* Email: happyamyhope@163.com
* Date: 2017/05/10
* History:
* 20170510: 批量解帧视频文件; ************************************************************************/
//-------------------------------------------------------------------------
//头文件
#include<highgui.h>
#include<cv.h>
#include<io.h>
#include<iostream>
#include<fstream>
#include <direct.h>//mkdir
using namespace std;
using namespace cv;
//调参
string filePath = "E:\\carriage_recognition\\video\\2017-05-02";
char picfilename[];
char save_path[];
//函数声明
void getFiles(string path, vector<string>& files)
{
//文件句柄
long hFile = ;
//文件信息
struct _finddata_t fileinfo;
string p;
if ((hFile = (long)_findfirst(p.assign(path).append("\\*").c_str(), &fileinfo)) != -)
{
do
{
//如果是目录,迭代之
//如果不是,加入列表
if ((fileinfo.attrib & _A_SUBDIR))
{
if (strcmp(fileinfo.name, ".") != && strcmp(fileinfo.name, "..") != )
getFiles(p.assign(path).append("\\").append(fileinfo.name), files);
}
else
{
files.push_back(p.assign(path).append("\\").append(fileinfo.name));
}
} while (_findnext(hFile, &fileinfo) == );
_findclose(hFile);
}
}
void mpf2frame(const char* videoPath, char* picfilename)
{
CvCapture* capture = cvCaptureFromFile(videoPath);
int fps = (int)cvGetCaptureProperty(capture, CV_CAP_PROP_FPS);
long nFrame = (long)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_COUNT); // 获取总帧数
int width = (int)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH);
int height = (int)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT);
IplImage* image = NULL;
int i = ; if (capture)
{
while ()
{
image = cvQueryFrame(capture);
if (image)
{
i++;
if (i % == && i <= nFrame )
{
sprintf(save_path, "%s\\%d.jpg", picfilename, i);
cvSaveImage(save_path, image);
}
else if (i < nFrame)
{ }
else if (i >= nFrame)
{
return;
}
}
}
} }
int main()
{ ofstream fout("video_list.txt");
vector<string> files;
//获取该路径下的所有文件
getFiles(filePath, files);
int size = (int)files.size();
for (int i = ; i < size; i++)
{
fout << files[i].c_str() << endl;
cout << i << endl;
const char* filename = files[i].c_str();
sprintf(picfilename, "%s\\frame", filePath.c_str());
_mkdir(picfilename);
sprintf(picfilename, "%s\\%d", picfilename, i);
_mkdir(picfilename);
mpf2frame(filename, picfilename); }
fout.close();
return ; }
代码说明:
1.每个视频文件的解帧文件夹在视频文件路径下,按序排列;
2.字符串的操作不熟练;
3.批量获取文件参考博客:http://blog.csdn.net/xuejiren/article/details/37040827#
完
批量解帧视频文件cpp的更多相关文章
- 批量下载ts视频文件
第一步 使用chrome 按F12进入开发模式,拖动视频进度条到视频结束: 然后找到.m3u8以结尾的文件并保存为文本文件. 第二步 点开查看里面是否存在如下以ts结尾的文件内容 ...... /20 ...
- OpenCV 学习笔记(15)openc解帧视频
1 修改读取视频的地址 2 修改保存图片序列的路径 String videopath = "F:/dongdong/0tool/3D/2模型/相机阵列/1_12cam亿级相机/数据/giga ...
- 开源一个自动整理B站UWP客户端软件进行批量下载的视频文件的小工具BiliVideosReoganizeHelper
大家都知道B站是一个很受欢迎的视频学习网站,上面有很多无私的up主上传了大量优秀的教学视频,在此向B站致敬,向广大UP主致敬. 有时,我们需要下载收藏一些视频,以防止以后找不到了.那么我们可以用B ...
- Linux批量“解压”JAR文件
当你需要”解压“很多jar文件时,可以通过很多方式进行,比如下面这种 1,列出每一个jar文件名,逐个展开 for i in $(ls *sour*.jar);do jar xvf $i;done
- 批量解压Zip文件
实现效果: 实现代码:
- java批量解压文件夹下的所有压缩文件(.rar、.zip、.gz、.tar.gz)
// java批量解压文件夹下的所有压缩文件(.rar..zip..gz..tar.gz) 新建工具类: package com.mobile.utils; import com.github.jun ...
- tar、tgz、gz文件批量解压方法
我是用for i in $(ls *.tgz);do tar xvf $i;done 批量解压的tgz文件的我是用for i in $(ls *.gz);do gzip -d $i;done批量解压的 ...
- 工作随笔——tar命令批量解压
由于linux的tar命令不支持批量解压,所以很多网友编写了好多支持批量解压的shell命令,收集了一下,供大家分享: 第一: for tar in *.tar.gz; do tar xvf $tar ...
- Linux命令:tar命令批量解压方法总结
tar命令批量解压方法总结 (2010-05-24 17:48:46) 转载▼ 标签: tar 批量解压 杂谈 分类: linux学习 由于linux的tar命令不支持批量解压,所以很多网友编写了好多 ...
随机推荐
- [框架模式]经典的模型视图控制器模式MVC
参考:<设计模式> http://blog.csdn.net/u010168160/article/details/43150049 百度百科 引言: Model(模型)是应用程序中用于处 ...
- MS SQL动态创建临时表
开发业务需求,需要对一个表作数据分析,由于数据量较大,而且分析时字段会随条件相应变化而变化. 因此计划先把数据转插入一个临时表,再对临时表的数据进行分析. 问题点是如何动态创建临时表.原先Insus. ...
- windows下的mongodb安装(真垃圾)
一.下载 3.6下载安装会卡死.只能下3.4的.http://downloads.mongodb.org/win32/mongodb-win32-x86_64-2008plus-ssl-v3.4-la ...
- ng的概念层次(官方文档摘录)
官方文档是这么说的: You write Angular applications by: composing HTML templates with Angularized markup, writ ...
- JDBC 与 Bean Shell的使用(一)获取值,并且传递
1.在使用Jmeter进行接口测试的时候,会使用到JDBC,连接数据库,操作数据库其得到的数据后续操作需要使用,这里我们使用了BeanShell的概念来获取JDBC的返回值 如下说明了联合使用的2种方 ...
- 现在转战c++的领域,纯幼儿园
C++中: 如果你用#include<iostream.h>就不需写这句话(旧标准).但是如果你用#include<iostream>就必须要写.但是在VS2010中就出现错误 ...
- hdu2955(概率DP)
The aspiring Roy the Robber has seen a lot of American movies, and knows that the bad guys usually g ...
- Android 时钟(由秒转变为时分秒)
int second = 0: Handler handler = new Handler(); handler.post(runnable); Runnable runnable = new Run ...
- 最应该注意的Oracle版本之一
最近以来,两个用户的库接连出现问题,经过查阅资料和分析,确定为数据库bug所致,其实,早在很久前,也遭遇过这个版本的类似bug,当时似乎还惊动了原厂的技术人员,后来确定为这个版本的bug,这个版本就是 ...
- SQL基础用法(实例一)
/* 2006年10月01日 SQL Server 数据库的基本操作 (1) 数据库的创建 (2) 数据表的创建以及相关约束的指定(含临时表) (3) 数据的添/删/改 (4) 数据的查询 */ () ...