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

包括了图片批量平移、旋转、以及像素变换

#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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/377359.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

aes模式_AES的完整形式是什么?

aes模式AES&#xff1a;高级加密标准 (AES: Advanced Encryption Standard) AES is an abbreviation of Advanced Encryption Standard, also known by its original name Rijndael. It is an arrangement of standard for the encryption of electronic data set up by the U.…

IOS ----UIButton用法详解

这段代码动态的创建了一个UIButton,并且把相关常用的属性都列举了.希望对大家有用. //这里创建一个圆角矩形的按钮UIButton *button1 [UIButton buttonWithType:UIButtonTypeRoundedRect];// 能够定义的button类型有以下6种&#xff0c;// typedef enum {// UIButtonTypeCusto…

针对一个class写出它的内存管理池以及总结出allocator类(三个版本)

目录示例版本1&#xff1a;per-class allocator,1示例版本2&#xff1a;per-class allocator,2最终版本&#xff1a;static allocator针对版本三进行macro如果我们不针对对象做内存管理&#xff0c;那么我们每次进行Foo* p new Foo(x);时总是会调用malloc函数。 尽管malloc函数…

kotlin 第一个程序_Kotlin程序添加两个矩阵

kotlin 第一个程序Given two matrices, we have to add them. 给定两个矩阵&#xff0c;我们必须将它们相加。 Example: 例&#xff1a; Input:matrix 1:[2, 3][4, 5][7, 1]matrix 2:[4, 6][9, 0][7, 6]Output:[6, 9][13, 5][14, 7] 在Kotlin中添加两个矩阵的程序 (Progra…

ubuntu 切换用户的命令[shell, linux]

使用ubuntu过程中免不了和shell(终端)打交道, 也不可避免在各种用户之间进行切换, 从而实现对各帐户的管理, 这个就涉及到了一个比较基础又很重要的工作,怎么样切换用户, 对于LINUX老鸟来说,这个根本不值不提的东东却让新手挠头不已, 现在给出普通用户和超级用户切换的命令(附图…

曲苑杂坛--修改数据库名和文件组名

/* 该脚本示例如何完整的修改一个数据库的名称. 数据库为原名称为DB_BEIJING&#xff0c;需要修改成DB_SHANGHAI nzperfect 2012.12.19 */--判断是否存在同名的数据库&#xff0c;以防止误删除 USE master GO IF EXISTS (SELECT name FROM sys.databases WHERE name NDB_BEIJI…

关于new handler与default、delete关键字

在https://blog.csdn.net/qq_42604176/article/details/111638568的operate_new源代码长啥样中谈到过new handler。 当operator new不能够分配出申请的内存时&#xff0c;会抛出bad_alloc 异常。有的编译器会返回0. 当定义成new(nothrow) Foo&#xff1b;就不会抛异常&#xff…

模式匹配运算符–Shell

转载&#xff1a;http://www.firefoxbug.net/?p722 Var/home/firefox/MyProgram/fire.login.name ${Variable#pattern}:如果模式匹配于变量值的开头处&#xff0c;则删除匹配的最短部分&#xff0c;并且返回剩下的部分 例子&#xff1a; [fire]$ echo ${Var#*/} [fire]$ home/…

河内塔问题_河内塔的Python程序

河内塔问题You are challenged for a challenge to find the number of moves required to move a stack of disks from one peg to another peg. Wait for a second, it sounds easy? Let’s find are what is going on and in this article, we are introducing a chapter o…

VC6、BC5、G2.9标准分配器一览

目录VC6标准分配器BC5标准分配器G2.9标准分配器VC6标准分配器 VCx中源码可以在电脑路径中找&#xff1a; [D:\Program Files\VisualStudio\Community\VC\Tools\MSVC\14.28.29333\include\xmemory] 不过太多了。大概在837行左右有关于allocator代码。还是先看侯捷PPT上的吧。 …

【转】shell 大括号、圆括号的使用

在这里我想说的是几种shell里的小括号,大括号结构和有括号的变量&#xff0c;命令的用法&#xff0c;如下&#xff1a; PHP 代码:1.${var} 2.$(cmd) 3.()和{} 4.${var:-string},${var:string},${var:string},${var:?string} 5.$((exp)) 6.$(var%pattern),$(var%%pattern),$(va…

css clear属性_CSS中的clear属性

css clear属性CSS | 清除财产 (CSS | clear Property) We know so much about float property and how it is used for styling our web pages. If you do not remember the float property, lets help jog your memory. The float property is used to set the elements in a …

linux find prune排除某目录或文件

http://blog.csdn.net/ysdaniel/article/details/7995681 查找cache目录下不是html的文件 find ./cache ! -name *.html -type f列出当前目录下的目录名,排除includes目录,后面的-print不能少 find . -path ./includes -prune -o -type d -maxdepth 1 -print排除多个目录,”(“…

嵌入式指针embedded pointer的概念以及用法

目录前言概念用法参考前言 在针对一个class写出它的内存管理池以及总结出allocator类(三个版本)中内存管理池的第二个版本中涉及到了一个非常重要的概念&#xff1a;嵌入式指针。同时嵌入式指针也在G2.9版本的alloc中出现。现在整理一下网上的一些用法和概念 概念 嵌入式指针…

CLI配置和编址

实施基本编址方案&#xff1a; 在设计新网络或规划现有网络时&#xff0c;至少要绘制一幅指示物理连接的拓扑图&#xff0c;以及一张列出以下信息的地址表&#xff1a; l 设备名称 l 设计中用到的接口 l IP 地址和子网掩码 l 终端设备&#xff08;如 PC&#xff09;的默…

sql语句中的in用法示例_PHP中的循环语句和示例

sql语句中的in用法示例循环 (Loops) Imagine that we need a program that says "hello world" 100 times. Its quite stressful and boring to write the statement -- echo "hello world" — 100 times in PHP. This is where loop statement facilitate…

love2d教程30--文件系统

在游戏里少不了文件操作&#xff0c;在love2d里我们可以直接用lua自带的io函数&#xff0c;如果不熟悉可以先读一下我的lua文件读写。 相对lua&#xff0c;love2d提供了更多的函数&#xff0c; 方便我们操作文件。不过可能处于安全考虑&#xff0c;love2d只允许我们访问两个目录…

std::alloc具体细节

G2.9 std::alloc的缺点&#xff1a; 1、在alloc::deallocate中没有将拿到的内存资源还给操作系统&#xff0c;在多任务中将占用很大资源 2、alloc::deallocate函数没有检查传入的p指针的有效性。在这里它默认p为alloc::allocate取得。 如果p并非alloc::allocate取得&#xf…

修改函数的返回地址

这篇随笔源自今天看的这篇文章http://www.cnblogs.com/bluesea147/archive/2012/05/19/2508208.html 1. 如何修改函数返回地址 今天主要写测试程序思考和验证了一下这个问题&#xff0c;先看一下这个&#xff23;程序 1 #include <stdio.h>2 void foo(){3 int a,…

调试JavaScript代码

JavaScript调试代码 (JavaScript debugging the code) Debugging is the process of finding mistakes or bugs in the program. There are several ways one can debug their JavaScript code. This article will walk you through the strict mode in JavaScript and excepti…