#include <iostream>
#include <string>
using namespace std;
void main()
{
string path = "C:/Visual Studio 2019/Projects/VOC2007_makevideo/000001.txt";
//1.获取不带路径的文件名
string::size_type iPos = path.find_last_of('/') + 1;
string filename = path.substr(iPos, path.length() - iPos);
cout << filename << endl;
//2.获取不带后缀的文件名
string name = filename.substr(0, filename.rfind("."));
cout << name << endl;
//3.获取后缀名
string suffix_str = filename.substr(filename.find_last_of('.') + 1);//获取('.')后面的位置到结尾的字符串
cout << suffix_str << endl;
}
1. s.substr(0,5):获得字符串s中从第0位开始,长度为5的字符串;默认时的长度为从开始位置到尾。
2. find_first_of(): 在字符串中查找第一个出现的字符c;
int find_first_of(char c, int start = 0)
查找字符串中第1个出现的c,由位置start开始。
如果有匹配,则返回匹配位置;否则,返回-1.
默认情况下,start为0,函数搜索整个字符串。
3. find_last_of():在字符串中查找最后一个出现的字符c;
int find_last_of(char c):
查找字符串中最后一个出现的c。有匹配,则返回匹配位置;否则返回-1.
该搜索在字符末尾查找匹配,所以没有提供起始位置。
4. find()正向查找,rfind()反向查找
一、批量读取文件夹下的图片和txt文档并处理
#include <iostream>
#include <sstream>
#include <vector>
#include <string>
#include "ImageProcess.h"
#include <stdio.h>
#include<opencv2/opencv.hpp>
#include<opencv2/imgproc/imgproc.hpp>
void main()
{
std::string imgdir = "C:\\Visual Studio 2019\\Projects\\VOC2007";
//创建一个String类型 名字为image_files的vector
string pattern_img = imgdir + "\\img\\*.jpg";
vector<string> image_files;
cv::glob(pattern_img, image_files);//把pattern_img路径下所有文件名存在image_files中
for (int i = 0; i < image_files.size(); ++i) {
string::size_type iPos = image_files[i].find_last_of('\\') + 1;
string filename = image_files[i].substr(iPos, image_files[i].length() - iPos);
std::cout << filename << std::endl;
//2.获取不带后缀的文件名
string name = filename.substr(0, filename.rfind("."));
std::cout << "无后缀:"<< name << std::endl;
cv::Mat img = cv::imread(image_files[i]);//000053_testimg.png
vector<vector<double>> data;
txt_to_vectordouble(data, imgdir + "\\labels\\" + name + ".txt");
std::cout << "txtdir: " << imgdir + "\\labels\\" + name + ".txt" << std::endl;
CImgProcess w;
w.ImgProcess_second(img, data);
string write_name = imgdir + "\\results\\" + name + ".jpg";
std::cout <<"write_name: " << write_name << std::endl;
cv::imwrite(write_name, img);
}
二、批量保存图片
int k = 1;
char writename[40];
sprintf(writename, "%s%d%s", "./data/output/qr", k, ".jpg");//sprintf将数据格式化写入字符串writename中
imwrite(writename, colorImage);
三、将文件夹的图片合成视频
/*************************将保存的图片合成为视频**********************************/
string pattern_img = imgdir + "\\results\\*.jpg";
vector<string> image_files;
cv::glob(pattern_img, image_files);//把pattern_img路径下所有文件名存在image_files中
int isColor = 1;
//每秒钟的帧率,即一秒放多少帧图片
int fps = 2;
//获取图片的宽和高
int frameWidth = 640;
int frameHeight = 480;
//声明VideoWriter类,写入视频
cv::VideoWriter writer;
/*cv::VideoWriter::fourcc('M', 'P', '4', 'V')生成MP4格式视频*/
/*cv::VideoWriter::fourcc('M', 'J', 'P', 'G')生成avi格式视频,大小比'X', 'V', 'I', 'D'大*/ /*cv::VideoWriter::fourcc('X', 'V', 'I', 'D')生成avi格式视频*/
writer.open("D:\\test.mp4", writer.fourcc('m', 'p', '4', 'v'), fps, cv::Size(frameWidth, frameHeight));
for (int i = 0; i < image_files.size(); ++i) {
cv::Mat img = cv::imread(image_files[i]);//000053_testimg.png
if (img.empty())
{
break;
}
//cv::imshow("src", img);
//cv::waitKey(30);
//调用writer类,传入图片
writer.write(img);
}

这篇博客展示了如何使用C++进行文件操作,包括获取文件名、后缀和批量读取图片。通过OpenCV库,实现了批量读取图片,处理图像数据,并将图片合成视频。此外,还涉及了文件路径处理和文件查找函数的应用。

被折叠的 条评论
为什么被折叠?



