简单的数据增强代码(C++与opencv)

171 阅读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>
#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;

Mat Translation(Mat& src, int x, int y)
{
	cv::Mat dst;

	cv::Size dst_sz = src.size();

	//定义平移矩阵
	cv::Mat t_mat = cv::Mat::zeros(2, 3, CV_32FC1);

	t_mat.at<float>(0, 0) = 1;
	t_mat.at<float>(0, 2) = x; //水平平移量
	t_mat.at<float>(1, 1) = 1;
	t_mat.at<float>(1, 2) = y; //竖直平移量

	//根据平移矩阵进行仿射变换
	cv::warpAffine(src, dst, t_mat, dst_sz);

	//显示平移效果
	//cv::imshow("image", src);
	//cv::imshow("result", dst);
	return dst;
}

Mat Rotate(Mat& src, double angle)
{
	cv::Mat dst;

	cv::Size src_sz = src.size();
	cv::Size dst_sz(src_sz.height, src_sz.width);
	int len = max(src.cols, src.rows);

	//指定旋转中心
	cv::Point2f center(len / 2., len / 2.);

	//获取旋转矩阵(2x3矩阵)
	cv::Mat rot_mat = cv::getRotationMatrix2D(center, angle, 1.0);

	//根据旋转矩阵进行仿射变换
	cv::warpAffine(src, dst, rot_mat, dst_sz);
	return dst;
}

Mat K_Pixels(Mat& src, double K)
{
	cv::Mat dst = K * src;
	return dst;
}

fs::path p{ "D:/一些文件/python code/AI/使用数据集/增强后的label与文件名.txt" };
ofstream output{ p };
void Save_filenameLabel(cv::String savedfilename)
{
	output << savedfilename << "   " << to_string(1) << endl;
}
int main()
{
	cv::String path = "C:/Users/LENOVO/Desktop/颜色转换/";        //待处理图片文件夹地址
	cv::String dest = "C:/Users/LENOVO/Desktop/增强后的图片/";    //处理后图片的保存地址
	cout << "获取地址成功" << endl;
	cv::String savedfilename;
	std::vector<cv::String> filenames;
	int len = path.length();
	cv::Mat srcImg;
	cv::glob(path, filenames);                 //opencv里面用来读取指定路径下文件名的一个很好用的函数		
	for (int i = 0; i < 13; i++) {
		srcImg = cv::imread(filenames[i]);
		resize(srcImg, srcImg, Size(128, 128));
		Mat dstImg;
		int Count = 1;
		//*************************对图片的处理部分***************************/
		向右边下方平移
		for (int j = 1; j < 21; j++)
		{
			dstImg = Translation(srcImg, j * 2, j * 2);
			savedfilename = dest + to_string(Count) + filenames[i].substr(len);

			std::cout << savedfilename << std::endl;
			cv::imwrite(savedfilename, dstImg);
			Save_filenameLabel(to_string(Count) + filenames[i].substr(len));
			cout << "第" << j << "张完成" << endl;
			Count++;
		}
		向左上方平移
		for (int j = 1; j < 21; j++)
		{
			dstImg = Translation(srcImg, -1 * j * 2, -1 * j * 2);
			savedfilename = dest + to_string(Count) + filenames[i].substr(len);

			std::cout << savedfilename << std::endl;
			cv::imwrite(savedfilename, dstImg);
			cout << "第" << j << "张完成" << endl;
			Save_filenameLabel(to_string(Count) + filenames[i].substr(len));
			Count++;
		}
		向右边上方平移
		for (int j = 1; j < 21; j++)
		{
			dstImg = Translation(srcImg, j * 2, -1 * j * 2);
			savedfilename = dest + to_string(Count) + filenames[i].substr(len);

			std::cout << savedfilename << std::endl;
			cv::imwrite(savedfilename, dstImg);
			cout << "第" << j << "张完成" << endl;
			Save_filenameLabel(to_string(Count) + filenames[i].substr(len));
			Count++;
		}
		向左下方平移
		for (int j = 1; j < 21; j++)
		{
			dstImg = Translation(srcImg, -1 * j * 2, j * 2);
			savedfilename = dest + to_string(Count) + filenames[i].substr(len);

			std::cout << savedfilename << std::endl;
			cv::imwrite(savedfilename, dstImg);
			cout << "第" << j << "张完成" << endl;
			Save_filenameLabel(to_string(Count) + filenames[i].substr(len));
			Count++;
		}
		//旋转
		for (int j = 1; j < 21; j++)
		{
			dstImg = Rotate(srcImg, j * 8);
			savedfilename = dest + to_string(Count) + filenames[i].substr(len);

			std::cout << savedfilename << std::endl;
			cv::imwrite(savedfilename, dstImg);
			cout << "第" << j << "张完成" << endl;
			Save_filenameLabel(to_string(Count) + filenames[i].substr(len));
			Count++;
		}
		//像素变化
		for (int j = 1; j < 11; j++)
		{
			dstImg = K_Pixels(srcImg, 0.5 + j * 0.1);
			savedfilename = dest + to_string(Count) + filenames[i].substr(len);

			std::cout << savedfilename << std::endl;
			cv::imwrite(savedfilename, dstImg);
			cout << "第" << j << "张完成" << endl;
			Save_filenameLabel(to_string(Count) + filenames[i].substr(len));
			Count++;
		}
		//resize(srcImg, dstImg, Size(128, 128));
		//********************************************************************/
	}
	output.close();
	waitKey(0);
	return 0;
}