會將圖片分到兩個文件夾中:
#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;}