From 373370903dc4f897ff67f382b345ca252401b856 Mon Sep 17 00:00:00 2001 From: yuxue Date: Mon, 18 May 2020 15:22:31 +0800 Subject: [PATCH] no commit message --- src/main/java/com/yuxue/util/ImageUtil.java | 131 ++++++++++++++++++ .../java/com/yuxue/test/PlateRecoTest.java | 37 ----- 2 files changed, 131 insertions(+), 37 deletions(-) create mode 100644 src/main/java/com/yuxue/util/ImageUtil.java diff --git a/src/main/java/com/yuxue/util/ImageUtil.java b/src/main/java/com/yuxue/util/ImageUtil.java new file mode 100644 index 00000000..3e668623 --- /dev/null +++ b/src/main/java/com/yuxue/util/ImageUtil.java @@ -0,0 +1,131 @@ +package com.yuxue.util; + +import java.util.Arrays; +import java.util.Map; +import java.util.Set; + +import org.bytedeco.javacpp.BytePointer; +import org.bytedeco.javacpp.opencv_core; +import org.bytedeco.javacpp.opencv_core.Mat; +import org.bytedeco.javacpp.opencv_core.MatVector; +import org.bytedeco.javacpp.opencv_core.Size; +import org.bytedeco.javacpp.opencv_imgcodecs; +import org.bytedeco.javacpp.opencv_imgproc; + +import com.google.common.collect.Maps; + + +/** + * 车牌图片处理工具类 + * @author yuxue + * @date 2020-05-18 12:07 + */ +public class ImageUtil { + + private static String DEFAULT_BASE_TEST_PATH = "D:/PlateDetect/temp/"; + + public static final int DEFAULT_GAUSSIANBLUR_SIZE = 5; + + public static void main(String[] args) { + + String tempPath = DEFAULT_BASE_TEST_PATH ; + FileUtil.createDir(tempPath); // 创建文件夹 + + // String filename = DEFAULT_BASE_TEST_PATH + "test01.jpg"; + String filename = DEFAULT_BASE_TEST_PATH + "test.png"; + Mat inMat = opencv_imgcodecs.imread(filename); + + ImageUtil.rgb2Hsv(inMat, true, tempPath); + // ImageUtil.gaussianBlur(inMat, true, tempPath); + } + + + /** + * 获取HSV中各个颜色所对应的H的范围 + * HSV是一种比较直观的颜色模型,所以在许多图像编辑工具中应用比较广泛,这个模型中颜色的参数分别是:色调(H, Hue),饱和度(S,Saturation),明度(V, Value) + * 1.PS软件时,H取值范围是0-360,S取值范围是(0%-100%),V取值范围是(0%-100%)。 + * 2.利用openCV中cvSplit函数的在选择图像IPL_DEPTH_32F类型时,H取值范围是0-360,S取值范围是0-1(0%-100%),V取值范围是0-1(0%-100%)。 + * 3.利用openCV中cvSplit函数的在选择图像IPL_DEPTH_8UC类型时,H取值范围是0-180,S取值范围是0-255,V取值范围是0-255 + * @param inMat + * @param debug + */ + public static void getHSVValue(Mat inMat, Boolean debug, String tempPath) { + + int channels = inMat.channels(); + int nRows = inMat.rows(); + // 图像数据列需要考虑通道数的影响; + int nCols = inMat.cols() * channels; + + // 连续存储的数据,按一行处理 + if (inMat.isContinuous()) { + nCols *= nRows; + nRows = 1; + } + Map map = Maps.newHashMap(); + for (int i = 0; i < nRows; ++i) { + BytePointer p = inMat.ptr(i); + for (int j = 0; j < nCols; j += 3) { + int H = p.get(j) & 0xFF; + int S = p.get(j + 1) & 0xFF; + int V = p.get(j + 2) & 0xFF; + + if(map.containsKey(H)) { + int count = map.get(H); + map.put(H, count+1); + } else { + map.put(H, 1); + } + + } + } + + Set set = map.keySet(); + Object[] arr = set.toArray(); + Arrays.sort(arr); + for (Object key : arr) { + System.out.println(key + ": " + map.get(key)); + } + + return; + } + + + /** + * rgb图像转换为hsv图像 + * @param inMat + * @param debug + * @param tempPath + * @return + */ + public static Mat rgb2Hsv(Mat inMat, Boolean debug, String tempPath) { + // 转到HSV空间进行处理 + Mat hsvMat = new Mat(inMat.rows(), inMat.cols(), opencv_imgproc.CV_BGR2HSV); + opencv_imgproc.cvtColor(inMat, hsvMat, opencv_imgproc.CV_BGR2HSV); + MatVector hsvSplit = new MatVector(); + opencv_core.split(hsvMat, hsvSplit); + // opencv_imgproc.equalizeHist(hsvSplit.get(2), hsvSplit.get(2)); + // opencv_core.merge(hsvSplit, hsvMat); + + if (debug) { + opencv_imgcodecs.imwrite(tempPath + "hsvMat_"+System.currentTimeMillis()+".jpg", hsvMat); + } + return hsvMat; + } + + + /** + * 高斯模糊 + * @param inMat + * @param debug + * @return + */ + public static Mat gaussianBlur(Mat inMat, Boolean debug, String tempPath) { + Mat gsMat = new Mat(); + opencv_imgproc.GaussianBlur(inMat, gsMat, new Size(DEFAULT_GAUSSIANBLUR_SIZE, DEFAULT_GAUSSIANBLUR_SIZE), 0, 0, opencv_core.BORDER_DEFAULT); + if (debug) { + opencv_imgcodecs.imwrite(tempPath + "gaussianBlur.jpg", gsMat); + } + return gsMat; + } + +} diff --git a/src/test/java/com/yuxue/test/PlateRecoTest.java b/src/test/java/com/yuxue/test/PlateRecoTest.java index fb32f5ce..175324a5 100644 --- a/src/test/java/com/yuxue/test/PlateRecoTest.java +++ b/src/test/java/com/yuxue/test/PlateRecoTest.java @@ -188,43 +188,6 @@ public class PlateRecoTest { String imgPath = "res/image/test_image/debug_resize_2.jpg"; Mat src = opencv_imgcodecs.imread(imgPath); - // 获取绿牌的H值范围 - /*MatVector hsvSplit = new MatVector(); - split(src_hsv, hsvSplit); - equalizeHist(hsvSplit.get(2), hsvSplit.get(2)); - merge(hsvSplit, src_hsv); - - int channels = src_hsv.channels(); - int nRows = src_hsv.rows(); - // 图像数据列需要考虑通道数的影响; - int nCols = src_hsv.cols() * channels; - - // 连续存储的数据,按一行处理 - if (src_hsv.isContinuous()) { - nCols *= nRows; - nRows = 1; - } - Map map = Maps.newHashMap(); - for (int i = 0; i < nRows; ++i) { - BytePointer p = src_hsv.ptr(i); - for (int j = 0; j < nCols; j += 3) { - int H = p.get(j) & 0xFF; - int S = p.get(j + 1) & 0xFF; - int V = p.get(j + 2) & 0xFF; - - if(map.containsKey(H)) { - int count = map.get(H); - map.put(H, count+1); - } else { - map.put(H, 1); - } - - } - } - map.entrySet().forEach(n->{ - System.err.println(n.getKey() + "\t" + n.getValue()); - });*/ - // 判断绿色车牌 Mat src_hsv = new Mat(); opencv_imgproc.cvtColor(src, src_hsv, opencv_imgproc.CV_BGR2HSV);