java opencv的环境搭建就不在赘婿了~
直接上代码
io递归读取文件代码
package imgPorjectDataManager;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
public class fileManager {
public static void main(String[] args) {
List<String> list=new ArrayList<String>();
List<String> list2=new ArrayList<String>();
getFiles("C://Users//86183//Desktop//ces//img", list);
getFiles("C://Users//86183//Desktop//ces//xml", list);
for (String string : list2) {
System.out.println(string);
}
for (String string : list) {
System.out.println(string);
}
}
/**
* 边缘校验
*/
public static void checkFilePath(String path) {
if (path.trim().length() == 0 || path == null) {
throw new IllegalArgumentException("路径不合法");
}
}
/**
* 1.递归读取获得每个文件的路径
*
* @throws FileNotFoundException
*/
public static void getFiles(String path, List<String> list) {
checkFilePath(path);
File file = new File(path);
if (file.isDirectory()) {
File[] files = file.listFiles();
for (int i = 0; i < files.length; i++) {
if (files[i].isDirectory()) {
getFiles(files[i].getPath(), list);
} else {
list.add(files[i].getPath());
}
}
} else {
list.add(file.getPath());
}
}
/**
* 2.IO流读取文件,数据为字符串
*
* @param path
* @throws IOException
*/
public static List<String> readFileFromFilePath(List<String> list)
throws IOException {
FileInputStream fil;
BufferedReader bfr = null;
StringBuffer sbf = new StringBuffer();
List<String> stringData = new ArrayList<String>();
for (String string : list) {
checkFilePath(string);
File file = new File(string);
try {
bfr = new BufferedReader(new java.io.FileReader(file));
String tempStr;
while ((tempStr = bfr.readLine()) != null) {
sbf.append(tempStr + "\n");
}
bfr.close();
stringData.add(sbf.toString());
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
return stringData;
}
}
opencv的api调用实现图片多种方式处理的函数封装代码
package imgPorjectDataManager;
import static org.opencv.core.Core.BORDER_DEFAULT;
import static org.opencv.core.Core.addWeighted;
import static org.opencv.core.Core.convertScaleAbs;
import static org.opencv.core.CvType.CV_16S;
import static org.opencv.imgproc.Imgproc.Sobel;
import static org.opencv.imgproc.Imgproc.cvtColor;
import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.highgui.HighGui;
import org.opencv.imgproc.Imgproc;
import pojo.xml;
public class ImageUtil {
public static final int MIN_VAL = 0;
public static final int MAX_VAL = 255;
public static final int BASE_VAL = (MIN_VAL + MAX_VAL) >>> 1;//大于中间值表示增强效果,小于中间值表示消减效果
/**
* 镜像翻转
* @param mat
* @return
*/
public static Mat mirrorImageMaker(Mat mat,xml xmlObj){
Mat dst2 = new Mat(mat.rows(), mat.cols(), CvType.CV_8UC3);
Core.flip(mat, dst2, 1);
System.out.println(mat.size());
double height=Integer.parseInt(mat.size().toString().split("x")[0]);
double weight=Integer.parseInt(mat.size().toString().split("x")[1]);
double xmin=xmlObj.getXmin();
double ymin=xmlObj.getYmin();
double xmax=xmlObj.getXmax();
double ymax=xmlObj.getYmax();
xmlObj.setXmin(height-xmax);
xmlObj.setYmin(ymin);
xmlObj.setXmax(height-xmin);
xmlObj.setYmax(ymax);
return dst2;
}
/**
* 图像缩放
* @param mat
* @param size
* @return
*/
public static Mat imageResize(Mat mat,double size,xml xmlObj){
Mat newMat= new Mat();
String ls =mat.size().toString().split("x")[0];
double longs=Integer.parseInt(ls);
System.out.println(longs);
String hs =mat.size().toString().split("x")[1];
double height=Integer.parseInt(hs);
System.out.println(height);
Imgproc.resize(mat,newMat,new Size(longs*size,height*size));
double xmin=xmlObj.getXmin();
double ymin=xmlObj.getYmin();
double xmax=xmlObj.getXmax();
double ymax=xmlObj.getYmax();
xmlObj.setXmin(xmin*size);
xmlObj.setYmin(ymin*size);
xmlObj.setXmax(xmax*size);
xmlObj.setYmax(ymax*size);
return newMat;
}
/**
* @Description: 将矩阵进行转置
* @Param: mat 要转置的图像矩阵
* @Return: 转置过后的图像矩阵
* @Author: followWindDog
* @Date: 2018/4/18
*/
public static Mat transposition(Mat mat,xml xmlObj) {
System.out.println(mat.size());
double height=Integer.parseInt(mat.size().toString().split("x")[0]);
double weight=Integer.parseInt(mat.size().toString().split("x")[1]);
double xmin=xmlObj.getXmin();
double ymin=xmlObj.getYmin();
double xmax=xmlObj.getXmax();
double ymax=xmlObj.getYmax();
xmlObj.setXmin(ymin);
xmlObj.setYmin(height-xmax);
xmlObj.setXmax(ymax);
xmlObj.setYmax(height-xmin);
Mat ret = new Mat(mat.width(), mat.height(), mat.type());
for (int i = 0; i < mat.height(); i++) {
for (int j = 0; j < mat.width(); j++) {
double[] vals = mat.get(i, j);
ret.put(j, i, vals);
}
}
return ret;
}
/**
* @Description: 图像饱和度调节
* @Param: Mat 传入的图像矩阵
* @Param: val 调节系数
* @Return: 调节完成的图像矩阵
* @Author: followWindDog
* @Date: 2018/4/18
*/
public static Mat shiftSaturability(Mat mat, int val) {
if (val == BASE_VAL) return mat;
Mat hsv = new Mat();
double f;
boolean flag = false;
if (val > BASE_VAL) {
flag = true;
f = 1.0 * (val - BASE_VAL) / BASE_VAL;
} else {
f = 1.0 * val / BASE_VAL;
}
Imgproc.cvtColor(mat, hsv, Imgproc.COLOR_BGR2HSV);
for (int i = 0; i < hsv.height(); i++) {
for (int j = 0; j < hsv.width(); j++) {
double[] vals = hsv.get(i, j);
if (flag) {
vals[1] = vals[1] + (MAX_VAL - vals[1]) * f;
} else {
vals[1] = vals[1] * f;
}
hsv.put(i, j, vals);
}
}
Mat ret = new Mat();
Imgproc.cvtColor(hsv, ret, Imgproc.COLOR_HSV2BGR);
return ret;
}
/**
* @Description: 图像的对比度调节
* @Param: Mat 传入的图像矩阵
* @Param: val 调节系数
* @Return: 调节完成的图像矩阵
* @Author: followWindDog
* @Date: 2018/4/25
*/
public static Mat shiftContrast(Mat img, int val) {
if (val == BASE_VAL) return img;
Mat ret = new Mat(img.height(), img.width(), img.type());
double maxx = -1, minn = 300.0;
for (int i = 0; i < img.height(); i++) {
for (int j = 0; j < img.width(); j++) {
double[] vals = img.get(i, j);
for (int k = 0; k < vals.length; k++) {
maxx = maxx > vals[k] ? maxx : vals[k];
minn = minn < vals[k] ? minn : vals[k];
}
}
}
double midd = (maxx + minn) / 2;
double a;
if(val>BASE_VAL){
if(val==MAX_VAL)val--;
a = BASE_VAL/(1.0*(MAX_VAL-val));
}else{
a = (1.0 * val) / BASE_VAL;
}
double b = midd * (1 - a);
for (int i = 0; i < img.height(); i++) {
for (int j = 0; j < img.width(); j++) {
double[] vals = img.get(i, j);
for (int k = 0; k < vals.length; k++) {
vals[k] = a * vals[k] + b;
}
ret.put(i, j, vals);
}
}
return ret;
}
/**
* @Description: 图像亮度调节
* @Param: Mat 传入的图像矩阵
* @Param: val 调节系数
* @Return: 调节完成的图像矩阵
* @Author: followWindDog
* @Date: 2018/4/25
*/
public static Mat shiftBrightness(Mat img, int val) {
if (val == BASE_VAL)
return img;
Mat ret = new Mat(img.height(), img.width(), img.type());
int hei = img.height();
int wid = img.width();
double f;
boolean flag = false;
if (val > BASE_VAL) {
flag = true;
f = 1.0 * (MAX_VAL - val) / BASE_VAL;
} else {
f = 1.0 * val / BASE_VAL;
}
for (int i = 0; i < hei; i++) {
for (int j = 0; j < wid; j++) {
double[] vals = img.get(i, j);
for (int k = 0; k < vals.length; k++) {
if (flag) {
vals[k] = 255 - (vals[k] * f);
} else {
vals[k] = vals[k] * f;
}
}
ret.put(i, j, vals);
}
}
return ret;
}
/**
* @Description: 将图片进行锐化
* @Param: mat 传入的图像矩阵
* @Param: cellSize 滤波使用的方框大小
* @Param: factor 锐化强度
* @Return: 锐化过后的矩阵
* @Author: followWindDog
* @Date: 2018/4/18
*/
public static Mat sharpen(Mat mat, int cellSize, int factor) {
Mat filter = averageFiltering(mat, cellSize);
Mat ret = new Mat(mat.height(), mat.width(), mat.type());
for (int i = 0; i < ret.height(); i++) {
for (int j = 0; j < ret.width(); j++) {
double[] rgb = mat.get(i, j);
double[] frgb = filter.get(i, j);
for (int k = 0; k < rgb.length; k++) {
rgb[k] += factor * (rgb[k] - frgb[k]);
}
ret.put(i, j, rgb);
}
}
return ret;
}
private static int standardizeCellSize(int cellSize) {
return cellSize % 2 == 0 ? cellSize + 1 : cellSize;
}
/**
* @Description: 高斯函数
* @Param: x 到达中心的x方向距离
* @Param: y 到达中心的y方向距离
* @Param: y 到达中心的y方向距离
* @Return: variance 方差
* @Author: followWindDog
* @Date: 2018/4/20
*/
private static double gaussianFunction(double x, double y, double variance) {
return 1.0 / (2 * Math.PI * variance * variance) * Math.exp((-x * x - y * y) / (2 * variance * variance));
}
private static boolean chackRange(int i, int j, int hei, int wid) {
return i >= 0 && i < hei && j >= 0 && j < wid;
}
private static Mat filtering(Mat mat, double[][] weightMatrix) {
Mat ret = new Mat(mat.height(), mat.width(), mat.type());
double[][][] m = new double[mat.height()][mat.width()][mat.get(0, 0).length];
for (int i = 0; i < mat.height(); i++) {
for (int j = 0; j < mat.width(); j++) {
m[i][j] = mat.get(i, j);
}
}
int halfCellSize = weightMatrix.length >>> 1;
int hei = mat.height();
int wid = mat.width();
for (int i = 0; i < hei; i++) {
for (int j = 0; j < wid; j++) {
double[] suma = new double[3];
double sumb = 0;
for (int k = 0; k < weightMatrix.length; k++) {
for (int l = 0; l < weightMatrix.length; l++) {
int loci = i - (halfCellSize - k);
int locj = j - (halfCellSize - l);
if (chackRange(loci, locj, mat.height(), mat.width())) {
sumb += weightMatrix[k][l];
for (int n = 0; n < suma.length; n++) {
suma[n] += weightMatrix[k][l] * m[loci][locj][n];
}
}
}
}
for (int k = 0; k < suma.length; k++) {
suma[k] /= sumb;
}
ret.put(i, j, suma);
}
}
return ret;
}
public static Mat gaussianFiltering(Mat mat, int cellSize, double variance) {
//通过高斯函数计算每一个格子的权值
cellSize = standardizeCellSize(cellSize);
int hCellSize = cellSize >>> 1;
double[][] tCell = new double[cellSize][cellSize];
double sum = 0;
for (int i = 0; i < tCell.length; i++) {
for (int j = 0; j < tCell[i].length; j++) {
tCell[i][j] = gaussianFunction(hCellSize - i, hCellSize - j, variance);
sum += tCell[i][j];
}
}
for (int i = 0; i < tCell.length; i++) {
for (int j = 0; j < tCell[i].length; j++) {
tCell[i][j] = tCell[i][j] * 100 / sum;
}
}
return filtering(mat, tCell);
}
/**
* @Description: 最普通的均值滤波
* @Param: mat 要滤波的图像矩阵
* @Param: cellSize 滤波方框的大小
* @Return: 滤波完成后的矩阵
* @Author: followWindDog
* @Date: 2018/4/20
*/
public static Mat averageFiltering(Mat mat, int cellSize) {
//TODO 性能优化
Mat ret = new Mat(mat.height(), mat.width(), mat.type());
double[][][] mm = new double[mat.height()][mat.width()][mat.get(0, 0).length];
for (int i = 0; i < mat.height(); i++) {
for (int j = 0; j < mat.width(); j++) {
mm[i][j] = mat.get(i, j);
}
}
cellSize = standardizeCellSize(cellSize);
int halfCellSiz = cellSize >> 1;
for (int i = 0; i < mat.height(); i++) {
for (int j = 0; j < mat.width(); j++) {
double[] to = new double[3];
int fi = i - halfCellSiz, ti = i + halfCellSiz, fj = j - halfCellSiz, tj = j + halfCellSiz;
for (int k = 0; k < to.length; k++) {
double sum = 0;
int cnt = 0;
for (int l = fi; l <= ti; l++) {
for (int m = fj; m <= tj; m++) {
if (l >= 0 && l < mat.height() && m >= 0 && m < mat.width()) {
sum += mm[l][m][k];
cnt++;
}
}
}
to[k] = sum / cnt;
}
ret.put(i, j, to);
}
}
return ret;
}
/**
* @Description: 为图像添加类似油画的效果
* @Param: img 等待处理的图像
* @Return: 经过油画处理的图像
* @Author: followWindDog
* @Date: 2018/4/25
*/
public static Mat oilPainting(Mat img) {
Mat mat1 = edgeDetection(img);
Imgproc.GaussianBlur(img, img, new Size(11, 11), 20, 20, Core.BORDER_DEFAULT);
for (int i = 0; i < img.height(); i++) {
for (int j = 0; j < img.width(); j++) {
double[] doubles = img.get(i, j);
double[] doubles1 = mat1.get(i, j);
for (int k = 0; k < doubles.length; k++) {
doubles[k] -= 1 * doubles1[0];
}
img.put(i, j, doubles);
}
}
return img;
}
/**
* @Description: 为图像进行边缘检测
* @Param: img 等待边缘检测的图像矩阵
* @Return: 表示图像边缘的矩阵
* @Author: followWindDog
* @Date: 2018/4/25
*/
public static Mat edgeDetection(Mat img) {
Mat clone = img.clone();
int sizex = 5, sizey = 5;
double dx = 0, dy = 0;
Imgproc.GaussianBlur(clone, clone, new Size(sizex, sizey), dx, dy, BORDER_DEFAULT);
Mat grad_x = new Mat(), grad_y = new Mat(), src_gray = new Mat();
Mat abs_grad_x = new Mat(), abs_grad_y = new Mat();
cvtColor(clone, src_gray, Imgproc.COLOR_BGR2GRAY);
int scale = 1;
int delta = 0;
int ddepth = CV_16S;
Sobel(src_gray, grad_x, ddepth, 1, 0, 3, scale, delta, BORDER_DEFAULT);
convertScaleAbs(grad_x, abs_grad_x);
Sobel(src_gray, grad_y, ddepth, 0, 1, 3, scale, delta, BORDER_DEFAULT);
convertScaleAbs(grad_y, abs_grad_y);
Mat ret = new Mat();
addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0, ret);
return ret;
}
}
xml数据集的dom4j解析以及写入代码
package imgPorjectDataManager;
import java.io.File;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.SAXReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.util.List;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
import org.opencv.core.Mat;
import pojo.xml;
public class xmlManager {
/**
* 传入路径,解析xml文件,返回实体类对象
* @param path
* @param xmlObj
* @return
* @throws Exception
*/
public static xml getXmlObjectData(String path ,xml xmlObj) throws Exception{
SAXReader reader = new SAXReader();
File file = new File(path);
Document document = reader.read(file);
Element root = document.getRootElement();
xmlObj.setName(root.selectSingleNode("//filename").getText());
xmlObj.setXmax(Integer.parseInt(root.selectSingleNode("//xmax").getText()));
xmlObj.setYmax(Integer.parseInt(root.selectSingleNode("//ymax").getText()));
xmlObj.setXmin(Integer.parseInt(root.selectSingleNode("//xmin").getText()));
xmlObj.setYmin(Integer.parseInt(root.selectSingleNode("//ymin").getText()));
System.out.println(xmlObj);
return xmlObj;
}
/**
* xml注解保存类
* @param filePath 源文件路径
* @param xmlObj xml增强后数据
* @param encoding 编码
* @throws Exception 异常
*/
public static void writeToFile( String filePath,String newpath,xml xmlObj,
String encoding,Mat mat,String filename) throws Exception {
SAXReader reader = new SAXReader();
File file = new File(filePath);
Document document = reader.read(file);
Element root = document.getRootElement();
int height=Integer.parseInt(mat.size().toString().split("x")[0]);
int weight=Integer.parseInt(mat.size().toString().split("x")[1]);
root.selectSingleNode("//filename").setText(filename);
root.selectSingleNode("//path").setText(newpath);
root.selectSingleNode("//width").setText(weight+"");
root.selectSingleNode("//height").setText(height+"");
root.selectSingleNode("//xmax").setText(xmlObj.getXmax()+"");
root.selectSingleNode("//ymax").setText(xmlObj.getYmax()+"");
root.selectSingleNode("//xmin").setText(xmlObj.getXmin()+"");
root.selectSingleNode("//ymin").setText(xmlObj.getYmin()+"");
try {
OutputFormat fmt = OutputFormat.createPrettyPrint();
fmt.setEncoding(encoding);
XMLWriter xmlWriter = new XMLWriter(new OutputStreamWriter(
new FileOutputStream(newpath), encoding), fmt);
xmlWriter.write(document);
xmlWriter.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws Exception {
//E://cifen_data//Annotations//0000啊啊啊1.xml
xml xmlObj=new xml();
getXmlObjectData("//E://cifen_data//Annotations//00001.xml", xmlObj);
xmlObj.setXmax(15649);
// writeToFile("//E://cifen_data//Annotations//00001.xml", "//E://cifen_data//Annotations//0000啊啊啊123.xml", xmlObj, "UTF-8");
}
}
图像处理对外接口api,封装了多种图像处理逻辑的排列组合
package imgPorjectDataManager;
import java.io.File;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import pojo.xml;
public class imageManager {
static {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME); //加载动态链接库
}
/**
* 工厂模式
* 输入指定操作,输出目标图片
* @param mat 原图像
* @param xmlObj 注解数据
* @param size 增强扩大倍数
* @return
* @throws Exception
*/
public Mat imagerManagerMaker(Mat mat,xml xmlObj,String newImagPath,String xmlPath,String newXmlPath,String xmlFileName) throws Exception{
xmlManager.getXmlObjectData(xmlPath, xmlObj);
Mat newmat1=ImageUtil.mirrorImageMaker(mat, xmlObj);
imagerManagerSave(newmat1, newImagPath);
xmlManager.writeToFile(xmlPath, newXmlPath, xmlObj, "UTF-8", newmat1, xmlFileName);
return newmat1;
}
/**
* 缩放
* @param mat
* @param xmlObj
* @param newImagPath
* @param xmlPath
* @param newXmlPath
* @param xmlFileName
* @param size
* @return
* @throws Exception
*/
public Mat imagerManagerMaker2(Mat mat,xml xmlObj,String newImagPath,String xmlPath,String newXmlPath,String xmlFileName,double size) throws Exception{
xmlManager.getXmlObjectData(xmlPath, xmlObj);
Mat newmat1=ImageUtil.imageResize(mat, size, xmlObj);
imagerManagerSave(newmat1, newImagPath);
xmlManager.writeToFile(xmlPath, newXmlPath, xmlObj, "UTF-8", newmat1, xmlFileName);
return newmat1;
}
/**
* 矩阵转置
* @param mat
* @param xmlObj
* @param newImagPath
* @param xmlPath
* @param newXmlPath
* @param xmlFileName
* @param size
* @return
* @throws Exception
*/
public Mat imagerManagerMaker3(Mat mat,xml xmlObj,String newImagPath,String xmlPath,String newXmlPath,String xmlFileName) throws Exception{
xmlManager.getXmlObjectData(xmlPath, xmlObj);
Mat newmat1=ImageUtil.transposition(mat, xmlObj);
imagerManagerSave(newmat1, newImagPath);
xmlManager.writeToFile(xmlPath, newXmlPath, xmlObj, "UTF-8", newmat1, xmlFileName);
return newmat1;
}
/**
* 前三种组合形式
* @param mat
* @param xmlObj
* @param newImagPath
* @param xmlPath
* @param newXmlPath
* @param xmlFileName
* @param size
* @return
* @throws Exception
*/
public Mat imagerManagerMaker4(Mat mat,xml xmlObj,String newImagPath,String xmlPath,String newXmlPath,String xmlFileName,double size) throws Exception{
xmlManager.getXmlObjectData(xmlPath, xmlObj);
Mat newmat1=ImageUtil.transposition(mat, xmlObj);
Mat newmat2=ImageUtil.mirrorImageMaker(newmat1, xmlObj);
Mat newmat3=ImageUtil.imageResize(newmat2, size, xmlObj);
imagerManagerSave(newmat3, newImagPath);
xmlManager.writeToFile(xmlPath, newXmlPath, xmlObj, "UTF-8", newmat3, xmlFileName);
return newmat1;
}
/**
* 饱和度调节
* @param mat
* @param xmlObj
* @param newImagPath
* @param xmlPath
* @param newXmlPath
* @param xmlFileName
* @return
* @throws Exception
*/
public Mat imagerManagerMaker5(Mat mat,xml xmlObj,String newImagPath,String xmlPath,String newXmlPath,String xmlFileName,int val) throws Exception{
xmlManager.getXmlObjectData(xmlPath, xmlObj);
Mat newmat1=ImageUtil.shiftSaturability(mat, val);
imagerManagerSave(newmat1, newImagPath);
xmlManager.writeToFile(xmlPath, newXmlPath, xmlObj, "UTF-8", newmat1, xmlFileName);
return newmat1;
}
public Mat imagerManagerMaker6(Mat mat,xml xmlObj,String newImagPath,String xmlPath,String newXmlPath,String xmlFileName) throws Exception{
xmlManager.getXmlObjectData(xmlPath, xmlObj);
Mat newmat1=ImageUtil.oilPainting(mat);
imagerManagerSave(newmat1, newImagPath);
xmlManager.writeToFile(xmlPath, newXmlPath, xmlObj, "UTF-8", newmat1, xmlFileName);
return newmat1;
}
/**
* 图像保存类
* @param mat
* @param path
* @param fileName
*/
private void imagerManagerSave(Mat mat,String path){
Mat dstImage = mat.clone();
//保存图像
Imgcodecs.imwrite(path, dstImage);
}
}
数据集处理函数的封装,一共就写了6种,这边只测试了可行性,并没有将代码优化,思路的话可以做interface,1.8新特性可以封装非抽象方法,这样使用起来很方便也没有了这么多重复代码,有兴趣的可以自行开发
代码如下
package imgPorjectDataManager;
import java.io.File;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import pojo.xml;
public class manager {
/**
* 获取文件路径
* @param path
* @return
*/
public static List<String> getFilePathCollection(String path){
List<String> list=new ArrayList<String>();
fileManager.getFiles(path, list);
return list;
}
public static void start(){
String path="C://Users//86183//Desktop//ces//img";
List<String> list=getFilePathCollection(path);
int i=0;
for (String string : list) {
String filename="C:/Users/86183/Desktop/ces/xml"+string.split("img")[1].replace("\\", "/").replace(".jpg", ".xml");
//xml文件中注解的文件名称
String filenameString=System.currentTimeMillis()+""+i+"";
String newImagePathString="E://cifen_data//img_aug//"+filenameString+".jpg";
String newXmlPathString="E://cifen_data//xlm_aug//"+filenameString+".xml";
imageManager objImageManager=new imageManager();
if (!new File(string).exists()){
System.out.println("文件不存在");
}else{
Mat srcImg = Imgcodecs.imread(string); //opencv读取
if (srcImg.empty()){
System.out.println("加载图片失败!");
}else{
xml xmlObj=new xml();
try {
xmlManager.getXmlObjectData(filename, xmlObj);
objImageManager.imagerManagerMaker(srcImg, xmlObj, newImagePathString,filename ,newXmlPathString, filenameString);
} catch (Exception e) {
e.printStackTrace();
}
}
}
System.out.println(filenameString);
System.out.println(filename);
i++;
}
}
/**
* 缩放
*/
public static void start2(double size){
String path="C://Users//86183//Desktop//ces//img";
List<String> list=getFilePathCollection(path);
int i=0;
for (String string : list) {
String filename="C:/Users/86183/Desktop/ces/xml"+string.split("img")[1].replace("\\", "/").replace(".jpg", ".xml");
//xml文件中注解的文件名称
String filenameString=System.currentTimeMillis()+""+i+"";
String newImagePathString="E://cifen_data//img_aug//"+filenameString+".jpg";
String newXmlPathString="E://cifen_data//xlm_aug//"+filenameString+".xml";
imageManager objImageManager=new imageManager();
if (!new File(string).exists()){
System.out.println("文件不存在");
}else{
Mat srcImg = Imgcodecs.imread(string); //opencv读取
if (srcImg.empty()){
System.out.println("加载图片失败!");
}else{
xml xmlObj=new xml();
try {
xmlManager.getXmlObjectData(filename, xmlObj);
objImageManager.imagerManagerMaker2(srcImg, xmlObj, newImagePathString,filename ,newXmlPathString, filenameString, size);
} catch (Exception e) {
e.printStackTrace();
}
}
}
System.out.println(filenameString);
System.out.println(filename);
i++;
}
}
/**
* 转置
*/
public static void start3(){
String path="C://Users//86183//Desktop//ces//img";
List<String> list=getFilePathCollection(path);
int i=0;
for (String string : list) {
String filename="C:/Users/86183/Desktop/ces/xml"+string.split("img")[1].replace("\\", "/").replace(".jpg", ".xml");
//xml文件中注解的文件名称
String filenameString=System.currentTimeMillis()+""+i+"";
String newImagePathString="E://cifen_data//img_aug//"+filenameString+".jpg";
String newXmlPathString="E://cifen_data//xlm_aug//"+filenameString+".xml";
imageManager objImageManager=new imageManager();
if (!new File(string).exists()){
System.out.println("文件不存在");
}else{
Mat srcImg = Imgcodecs.imread(string); //opencv读取
if (srcImg.empty()){
System.out.println("加载图片失败!");
}else{
xml xmlObj=new xml();
try {
xmlManager.getXmlObjectData(filename, xmlObj);
objImageManager.imagerManagerMaker3(srcImg, xmlObj, newImagePathString,filename ,newXmlPathString, filenameString);
} catch (Exception e) {
e.printStackTrace();
}
}
}
System.out.println(filenameString);
System.out.println(filename);
i++;
}
}
/**
* 组合形式
* @param size
*/
public static void start4(double size){
String path="C://Users//86183//Desktop//ces//img";
List<String> list=getFilePathCollection(path);
int i=0;
for (String string : list) {
String filename="C:/Users/86183/Desktop/ces/xml"+string.split("img")[1].replace("\\", "/").replace(".jpg", ".xml");
//xml文件中注解的文件名称
String filenameString=System.currentTimeMillis()+""+i+"";
String newImagePathString="E://cifen_data//img_aug//"+filenameString+".jpg";
String newXmlPathString="E://cifen_data//xlm_aug//"+filenameString+".xml";
imageManager objImageManager=new imageManager();
if (!new File(string).exists()){
System.out.println("文件不存在");
}else{
Mat srcImg = Imgcodecs.imread(string); //opencv读取
if (srcImg.empty()){
System.out.println("加载图片失败!");
}else{
xml xmlObj=new xml();
try {
xmlManager.getXmlObjectData(filename, xmlObj);
objImageManager.imagerManagerMaker4(srcImg, xmlObj, newImagePathString,filename ,newXmlPathString, filenameString, size);
} catch (Exception e) {
e.printStackTrace();
}
}
}
System.out.println(filenameString);
System.out.println(filename);
i++;
}
}
/**
* 饱和度
* @param size
*/
public static void start5(int size){
String path="C://Users//86183//Desktop//ces//img";
List<String> list=getFilePathCollection(path);
int i=0;
for (String string : list) {
String filename="C:/Users/86183/Desktop/ces/xml"+string.split("img")[1].replace("\\", "/").replace(".jpg", ".xml");
//xml文件中注解的文件名称
String filenameString=System.currentTimeMillis()+""+i+"";
String newImagePathString="E://cifen_data//img_aug//"+filenameString+".jpg";
String newXmlPathString="E://cifen_data//xlm_aug//"+filenameString+".xml";
imageManager objImageManager=new imageManager();
if (!new File(string).exists()){
System.out.println("文件不存在");
}else{
Mat srcImg = Imgcodecs.imread(string); //opencv读取
if (srcImg.empty()){
System.out.println("加载图片失败!");
}else{
xml xmlObj=new xml();
try {
xmlManager.getXmlObjectData(filename, xmlObj);
objImageManager.imagerManagerMaker5(srcImg, xmlObj, newImagePathString,filename ,newXmlPathString, filenameString, size);
} catch (Exception e) {
e.printStackTrace();
}
}
}
System.out.println(filenameString);
System.out.println(filename);
i++;
}
}
/**
* 油画
* @param size
*/
public static void start6(){
String path="C://Users//86183//Desktop//ces//img";
List<String> list=getFilePathCollection(path);
int i=0;
for (String string : list) {
String filename="C:/Users/86183/Desktop/ces/xml"+string.split("img")[1].replace("\\", "/").replace(".jpg", ".xml");
//xml文件中注解的文件名称
String filenameString=System.currentTimeMillis()+""+i+"";
String newImagePathString="E://cifen_data//img_aug//"+filenameString+".jpg";
String newXmlPathString="E://cifen_data//xlm_aug//"+filenameString+".xml";
imageManager objImageManager=new imageManager();
if (!new File(string).exists()){
System.out.println("文件不存在");
}else{
Mat srcImg = Imgcodecs.imread(string); //opencv读取
if (srcImg.empty()){
System.out.println("加载图片失败!");
}else{
xml xmlObj=new xml();
try {
xmlManager.getXmlObjectData(filename, xmlObj);
objImageManager.imagerManagerMaker6(srcImg, xmlObj, newImagePathString,filename ,newXmlPathString, filenameString);
} catch (Exception e) {
e.printStackTrace();
}
}
}
System.out.println(filenameString);
System.out.println(filename);
i++;
}
}
public static void main(String[] args) {
// start();
// start2(0.5);
// start3();
// start4(0.5);
for (int i = 0; i <= 255; i=i+50) {
start5(i);
}
// start6();
}
}
整个项目尽量做到了解耦,一层一层封装很麻烦,有的地方没有trycatch可能有点小问题,懒得改了
主要思路,是为了解决数据增强时,注解的对应算法实现,这里解决思路是建立实体类,读取每张图片的时候同时读取xml的bbox xyxy(左上和右下)的数据,保存在实体类中,并在图像处理的缩放,转置(旋转),镜像,通过传引用将xml注解数据同步修改.实现思路不难
有兴趣的同学可以通过多种排列组合实现1000倍数据增强,我这里写的是固定8倍增强,想了想实现任意倍数增强需要对排列组合进行if筛选,Java函数式编程能力差一点,有能力的大佬提点意见哈