Java-openCV 数据增强4小时实现小样本数据集扩大

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函数式编程能力差一点,有能力的大佬提点意见哈

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值