会将图片分到两个文件夹中:
#include <opencv2/opencv.hpp>
#include "opencv2/features2d.hpp"
#include <vector>
#include <algorithm>
#include <iostream>
#include "windows.h"
#include <stdio.h>
#include <time.h>
#include <math.h>
#include <fstream>
#include <fstream>
#include <iostream>
#include <filesystem>
#include <vector>
#include <ctime>
#define WINDOW_NAME "【程序窗口】" using namespace cv;using namespace std;using std::ifstream;
using std::ofstream;
using std::cout;
using std::endl;
namespace fs = std::filesystem;int main()
{cv::String path = "D:/一些文件/python code/AI/新数据集/归一化数据集"; //待处理图片文件夹地址cv::String dest_train = "D:/一些文件/python code/AI/新数据集/测试集"; //处理后图片的保存地址cv::String dest_test = "D:/一些文件/python code/AI/新数据集/训练集"; //处理后图片的保存地址cout << "获取地址成功" << endl;cv::String savedfilename;std::vector<cv::String> filenames;int len = path.length();cv::Mat srcImg;cv::glob(path, filenames); //opencv里面用来读取指定路径下文件名的一个很好用的函数 //初始化一个随机vector,值为1的序号作为测试集,值为0的序号作为训练集srand((unsigned)time(NULL));vector<int> Test(filenames.size(), 0);for (int i = 0; i < Test.size() * 0.2; i++){int num = rand() % filenames.size();//如果已经存在了,重新初始化一个numwhile (Test[num] == 1){num = rand() % Test.size();}//如果不存在的话Test[num] = 1;}//根据vector的值划分数据集for (int i = 0; i < filenames.size(); i++) {srcImg = cv::imread(filenames[i], 0);//*************************对图片的处理部分***************************/if (Test[i] == 0){savedfilename = dest_train + filenames[i].substr(len);}else{savedfilename = dest_test + filenames[i].substr(len);}std::cout << savedfilename << std::endl;cv::imwrite(savedfilename, srcImg);cout << "第" << i << "张完成" << endl;}waitKey(0);return 0;
}
然后生成两个txt文件,分别写入图片名字。
#include <fstream>//ifstream读文件,ofstream写文件,fstream读写文件#include <string>//文本对象,储存读取的内容
#include <iostream>//屏幕输出cout
#include <cstdlib>//调用system("pause");
#include <windows.h>//用于函数SetConsoleOutputCP(65001);更改cmd编码为utf8
using namespace std;int main()
{SetConsoleOutputCP(65001);ifstream in("D:/一些文件/python code/AI/新数据集/name.txt");ofstream out_test; //("D:/一些文件/python code/AI/新数据集/test.txt");ofstream out_train; //("D:/一些文件/python code/AI/新数据集/train.txt");string line;cv::String path_train = "D:/一些文件/python code/AI/新数据集/测试集"; //处理后图片的保存地址cv::String path_test = "D:/一些文件/python code/AI/新数据集/训练集"; //处理后图片的保存地址std::vector<cv::String> filenames_train;std::vector<cv::String> filenames_test;int len_train = path_train.length();int len_test = path_test.length();cv::Mat srcImg;cv::glob(path_train, filenames_train); cv::glob(path_test, filenames_test);if (in) // 有该文件{while (getline(in, line)) // line中不包括每行的换行符{cout << line << endl;string NameOfPic = "";//读到这一行后,对这一行的字符串进行分割,从而得到文件名for (int i = 2; i < line.size(); i++){if (line[i - 2] == ' ' && line[i - 1] == ' ' && line[i] == ' '){NameOfPic.assign(line, 0, i-2);break;}}cout << NameOfPic << endl;int flag = 0;//在测试集图片文件夹中寻找,是否能找到一样的名字的文件for (int i = 0; i < filenames_test.size(); i++) {string path = path_test;path = path + '\\' + NameOfPic;if (path == filenames_test[i]){flag = 1;//追加写入out_test.open("D:/一些文件/python code/AI/新数据集/test.txt", ios::out | ios::app);out_test << line << endl;out_test.close();break;}}//如果在测试集中没有找到,说明在训练集中if (flag == 0){for (int i = 0; i < filenames_train.size(); i++){string path = path_train;path = path + '\\' + NameOfPic;if (path == filenames_train[i]){//追加写入out_train.open("D:/一些文件/python code/AI/新数据集/train.txt", ios::out | ios::app);out_train << line << endl;out_train.close();break;}}}}}else // 没有该文件{cout << "no such file" << endl;}system("pause");return 0;}