需求分析:
公司需要做鉴黄的业务,所以需要大量的图片资源,但是图片资源有限,所以只能对视频进行切割采集图片,目前应用市场上有的只能一次性对一个视频进行切割,如果有几百个视频,就需要分别切割几百次,刚好在学openCV,现学现卖,自己临时开发了一个可以同时切割一个目录下所有的视频的工具,可以在切割之前计算所有视频的总图片数量,还可以选择切割的图片数量
软件介绍:
运行环境:windows 64位操作系统
技术:OpenCV + c++, 用MFC 做了个简单界面 ,用MFC是因为简单,其实MFC已经过时了
使用场景:需要把视频切割成大量的图片资源的,例如目前的大数据,人工智能,图像分析等等都需要用到大量的图片资源,这个工具应该可以用得上
相对于其他视频切割软件的优势在于:可以一次性把一个文件夹下面的所有视频列表(或者文件夹列表,里面有视频)同时切割,而且可以选择切割的图片数量,然后均等切割
软件界面:
核心代码介绍:
解压函数
void unZip(string path, string path1, long number)
{
vector<String> listPath = getFilePath(path);
long allTotalFrame = 0;
for (int i = 0; i < listPath.size(); i++) {
VideoCapture cap;
cap.open(listPath[i]);
// 获取整视频帧数
long totalFrame = cap.get(CV_CAP_PROP_FRAME_COUNT);
allTotalFrame = allTotalFrame + totalFrame;
cout << "第 " << i << " 个视频宗贞数=" << totalFrame << endl;
}
cout << "总视频宗贞数=" << allTotalFrame << endl;
// 根据全部视频总帧数截取10000张图片,也就是每隔 allTotalFrame/10000 帧取一张
int imgIndex = 0;
for (int i = 0; i < listPath.size(); i++) {
VideoCapture cap;
cap.open(listPath[i]);
Mat frame;
cap >> frame;
for (;;)
{
Mat frame;
cap >> frame;
if (frame.empty())
{
break;
}
//char* imageSaveName = new char[200];
//将图片的路径及名称输入到imageSaveName中
string str = path1; // "F:\\test2\\";
string res = str+ "\\" + to_string(imgIndex)+".jpg";
cout << "index == " << imgIndex << endl;
if (number == 0) {
if (imgIndex % (int)(allTotalFrame / 10000) == 0) { //假如取10000张,就是每 allTotalFrame/10000 帧截取一张
cout << "输出图片" << endl;
imwrite(res, frame);
}
}
else {
if (imgIndex % (int)(allTotalFrame / number) == 0) { //假如取number张,就是每 allTotalFrame/number 帧截取一张
cout << "输出图片" << endl;
imwrite(res, frame);
}
}
imgIndex++;
}
}
}
因为时间关系就不详细介绍源码了,想了解更多的可以下载源码,源码的运行需要配置opencv环境哈,我的前几篇博客有介绍怎么配置opencv环境
源代码下载地址:
(网盘下载地址)https://pan.baidu.com/s/1urrl2Xa6R4lRwbbKpBZGJg
(github下载地址)https://github.com/SSYSSK/VideoZIP (里面也包括.exe 安装包)