包括了图片批量平移、旋转、以及像素变换
#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;
}