划分数据集代码(按照4:1的比例)以及根据各自文件名写入txt文件

204 阅读2分钟

会将图片分到两个文件夹中:

#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();
		//如果已经存在了,重新初始化一个num
		while (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;

}