将视频截取成图片的C++代码
之前写的,未加整理;
#include <QCoreApplication>
#include <iostream>
#include <time.h>
#include<sys/io.h>
#include<iostream>
#include<vector>
#include <string>
#include <list>
#include <dirent.h>
#include <sys/stat.h>
#include<opencv2/opencv.hpp>using namespace std;
int g_ntotalFrameNumber,g_ncurrentframe;
double g_currentpercent;#define FRAME_PER_NUME 20
#define FILENAME_SUFFIX_NUM 4
#define INPUT_VIDEO_PATH "/media/t/disk1/HOME/workplace/qt/videotoimage/video/1"
#define OUTPUT_IMAGE_PATH "/media/t/disk1/HOME/workplace/qt/videotoimage/output_image/"//vector<string> getFiles(const string &folder,const bool all /* = true */)
//{// vector<string> files;
// list<string> subfolders;
// subfolders.push_back(folder);// while (!subfolders.empty()) {// string current_folder(subfolders.back());// if (*(current_folder.end() - 1) != '/') { //确保地址是 “ ..../*” 结尾的
// current_folder.append("/*");
// }
// else {// current_folder.append("*");
// }// subfolders.pop_back();// struct _finddata_t file_info;
// long file_handler = _findfirst(current_folder.c_str(), &file_info);// while (file_handler != -1)
// {// if (all &&
// (!strcmp(file_info.name, ".") || !strcmp(file_info.name, ".."))) {// if (_findnext(file_handler, &file_info) != 0) break;
// continue;
// }
//#if 0
// 斜杆/ 和 反斜杠\ 的区别基本上就是这些了,下面再讨论一下相对路径和绝对路径。
// ./SRC/ 这样写表示,当前目录中的SRC文件夹;
// ../SRC/ 这样写表示,当前目录的上一层目录中SRC文件夹;
// /SRC/ 这样写表示,项目根目录(可以只磁盘根目录,也可以指项目根目录,具体根据实际情况而定)
//#endif// if (file_info.attrib & _A_SUBDIR)
// {// // it's a sub folder
// if (all)
// {// // will search sub folder
// string folder(current_folder);
// folder.pop_back(); // 就是减去最后的* string 的pop_back Delete last character Erases the last character of the string, effectively reducing its length by one.
// folder.append(file_info.name);// subfolders.push_back(folder.c_str());
// }
// }
// else
// {// // it's a file
// string file_path;
// // current_folder.pop_back();
// file_path.assign(current_folder.c_str()).pop_back();
// file_path.append(file_info.name);// files.push_back(file_path);
// }// if (_findnext(file_handler, &file_info) != 0) break;
// } // while
// _findclose(file_handler);
// }// return files;
//}
#if 0
int main(int argc, char *argv[])
{time_t t;struct tm * lt;bool f_stop = false;cv::Mat Input;std::string input_video_path = INPUT_VIDEO_PATH;cv::VideoCapture capture(input_video_path);if (!capture.isOpened())std::cout << "fail to open!" << std::endl;g_ntotalFrameNumber = capture.get(CV_CAP_PROP_FRAME_COUNT);std::cout << "整个视频共" << g_ntotalFrameNumber << "帧" << std::endl;//获得帧的宽高int w = static_cast<int>(capture.get(CV_CAP_PROP_FRAME_WIDTH));int h = static_cast<int>(capture.get(CV_CAP_PROP_FRAME_HEIGHT));cv::Size S(w, h);// 视频写入对象cv::VideoWriter writer("/home/t/result.avi", CV_FOURCC('m', 'p', '4', ' v'),25, cv::Size(1280, 720));while (!f_stop ){time (&t);lt = localtime (&t);for (int i = 0;i < 25;i++) {capture >> Input;if(Input.empty()){break;}}if(Input.empty()){break;}writer<<Input;g_currentpercent = int(g_ncurrentframe * 100 / g_ntotalFrameNumber);std::stringstream pathROIss;std::string pathROIs;pathROIss<<"/media/t/disk1/DukTo/Videos/20180518_HIKVISION_HDR_1/20190926"<< lt->tm_hour << lt->tm_min << "_" <<g_ncurrentframe<<".jpg";pathROIss>>pathROIs;imwrite(pathROIs, Input);g_ncurrentframe += 25;}//释放对象capture.release();return 0;
}
#endif
#if 1
//int main(int argc, char *argv[])
//{// //目标文件夹路径
// std::string inPath = "/media/t/disk1/DukTo/Videos/*.mp4";//遍历文件夹下的所有.jpg文件
// //用于查找的句柄
// long handle;
// struct _finddata_t fileinfo;
// //第一次查找
// handle = _findfirst(inPath.c_str(), &fileinfo);
// if (handle == -1)
// return -1;
// do
// {// //找到的文件的文件名
// printf("%s\n", fileinfo.name);// } while (!_findnext(handle, &fileinfo));// _findclose(handle);
// system("pause");
// return 0;
//}
void videotoimage(std::string input_video_path, std::string output_image_path, std::string filename)
{time_t t;struct tm * lt;bool f_stop = false;cv::Mat Input;cv::VideoCapture capture(input_video_path);if (!capture.isOpened())std::cout << "fail to open!" << std::endl;g_ntotalFrameNumber = capture.get(CV_CAP_PROP_FRAME_COUNT);std::cout << "整个视频共" << g_ntotalFrameNumber << "帧" << std::endl;//获得帧的宽高int w = static_cast<int>(capture.get(CV_CAP_PROP_FRAME_WIDTH));int h = static_cast<int>(capture.get(CV_CAP_PROP_FRAME_HEIGHT));cv::Size S(w, h);// 视频写入对象cv::VideoWriter writer("/home/t/result.avi", CV_FOURCC('m', 'p', '4', ' v'),25, cv::Size(1280, 720));while (!f_stop ){time (&t);lt = localtime (&t);for (int i = 0;i < FRAME_PER_NUME;i++) {capture >> Input;if(Input.empty()){break;}}if(Input.empty()){break;}writer<<Input;g_currentpercent = int(g_ncurrentframe * 100 / g_ntotalFrameNumber);std::stringstream pathROIss;std::string pathROIs;pathROIss<<output_image_path<<"/"<<filename<<"_"<< lt->tm_hour << lt->tm_min << "_" <<g_ncurrentframe<<".jpg";pathROIss>>pathROIs;imwrite(pathROIs, Input);g_ncurrentframe += FRAME_PER_NUME;}//释放对象capture.release();//return 0;
}
int main()
{string src_video_path = INPUT_VIDEO_PATH;DIR* dir = opendir(src_video_path.data());//打开指定目录dirent* p = NULL;//定义遍历指针while((p = readdir(dir)) != NULL)//开始逐个遍历{//这里需要注意,linux平台下一个目录中有"."和".."隐藏文件,需要过滤掉if(p->d_name[0] != '.')//d_name是一个char数组,存放当前遍历到的文件名{g_ncurrentframe = 0;string dirpath = OUTPUT_IMAGE_PATH;
// std::stringstream pathROIss;
// std::string pathROIs;
// pathROIss<<"/media/t/disk1/DukTo/Videos"<< lt->tm_hour << lt->tm_min << "_" <<g_ncurrentframe<<".jpg";
// pathROIss>>pathROIs;string str = string(p->d_name);cout<<str<<endl;string videopath = src_video_path + "/";videopath += str;//str.erase(remove(str.begin() , str.end() , '.') , str.end() );str.erase( str.size()-FILENAME_SUFFIX_NUM, FILENAME_SUFFIX_NUM);dirpath += str;mkdir(dirpath.data(),S_IRWXU);videotoimage(videopath,dirpath,str);
// string name = "/home/xxx/test/" + str;
// cout<<name<<endl;}}closedir(dir);//关闭指定目录
}#endif
这是ubuntu系统下的代码,windows系统下,你需要将#include<sys/io.h>
修改成#include <direct.h>,将mkdir(dirpath.data(),S_IRWXU);修改成mkdir(dirpath.data());即可。
将视频截取成图片的C++代码相关推荐
- Python 将视频 截取 成图片 附cv2处理教程
import cv2 import time import os input_video = r'E:/Desktop/video/1.mp4' output_dir = r'E:/Desktop/p ...
- opencv cv2.imwrite()将视频切割成图片保存失败 + 以及按秒切帧代码
原因:文件的路径和文件名不能是中文的 代码 按秒切割视频成图片: # 视频切割成图片 import cv2 import glob import osdef video_to_frame(save_p ...
- 用python把视频分解成图片
# 用python把视频分解成图片 import cv2 # 读取一段视频 cap=cv2.VideoCapture("d:/1.mp4") # 用作计数 i=0 # 循环判断视频 ...
- python opencv PIL 视频分割成图片 图片合成为视频 修改图片大小(抗锯齿)
Python代码将原有的视频分割成图片,我的例子是一帧一帧的分割 用python+opencv完成视频的分割 import cv2 #导入opencv模块 print(2) #测试是否运行 vc=cv ...
- python 脚本将视频转化成图片 | python scripts to convert video to pictures
python 脚本将视频转化成图片 | python scripts to convert video to pictures python video_to_images.py 运行时,修改输入.输 ...
- 怎样将手机视频转换成图片?手机怎么把视频做成gif动图?
怎样将手机视频转换成图片?一般在需要将视频转换成gif格式的图片时,需要在电脑上使用专业的视频处理软件进行操作,但是现在有很多视频素材是从手机上保存的,如果需要从手机上把视频转gif应该怎么操作呢?今 ...
- python将视频分割成图片
使用python将视频分割成图片 python版本: 3.7.2 使用到的库:opencv (安装命令:pip install opencv-python) import cv2# 定义保存图片函数 ...
- 将视频抽取成图片,并对图片进行批量命名opencv代码
运行环境:vs2015+opencv3.2,接近类似环境都可以,vs2012以上,opencv3.0以上 #include <iostream> //#include "cv.h ...
- 【OpenCV入门到精通之九】OpenCV之视频截取、图片与视频互转
一.图片与视频的关系 图片是静止的,把众多的有渐变规律的图片,按时间组织起来,即构成视频. 视频是连动的,把视频中每个瞬间的画面停顿下来,则画面显示的就是图片. 视频帧 视频中每个瞬间的画面停顿下来的 ...
- 如何把视频分解成图片?怎么逐帧提取视频中的图片?
在工作中遇到需要将一段视频逐帧分解成图片该怎么做?小编在这这里给大家分享一款视频提取图片(https://www.yasuoshipin.com工具,一起来了解一下吧. 在所有功能中,选择视频提取图片 ...
最新文章
- 【Python】百度首页GIF动画的爬虫
- CentOS 7 修改时区例如上海时区
- 微软私有云分享(R2)1-自定义脚本
- 【Android】Camera 使用浅析
- pygame中Rect(left, top, width, height)的参数详解
- AngularJs学习笔记(四)
- Redis学习一Redis的介绍与安装部署
- oracle常用用户权限,oracle创建新用户及授予常用权限
- server2019 sqlcmd命令安装_Ubuntu20.04LTS安装MS sql-server2019的方法
- 等式与不等式约束的序列二次规划(SQP)
- datapump跨平台升级迁移的总结
- Onvif之框架生成-基于gsoap2.8.27
- 安全数组-简易矩阵容器-STL及迭代器仿写作业
- 带滤镜拍照的app_这8款拍照修图APP,简直就是逼格神器
- bootstrap菜单html,Bootstrap实现下拉菜单效果
- ios订阅其他国家节假日日历
- js 周期性定时器
- 本地搭建我的世界服务器(可联机)
- iOS开发 - 给Label加下划线、中划线
- 攀登数据基础设施高峰,这是一场勇敢者的游戏