From d264764beae96628b28ee579d7750799856b27ba Mon Sep 17 00:00:00 2001 From: yuxue Date: Thu, 21 May 2020 14:13:20 +0800 Subject: [PATCH] no commit message --- README.md | 4 - res/doc_image/debug_result.jpg | Bin 58693 -> 0 bytes src/main/java/com/yuxue/util/FileUtil.java | 21 ++- src/main/java/com/yuxue/util/ImageUtil.java | 136 +++++++++++++++----- 4 files changed, 123 insertions(+), 38 deletions(-) delete mode 100644 res/doc_image/debug_result.jpg diff --git a/README.md b/README.md index bd110d6b..5361a772 100644 --- a/README.md +++ b/README.md @@ -60,10 +60,6 @@ debug_Contours: ![1.png](./res/doc_image/debug_Contours.jpg) -debug_result: - -![1.png](./res/doc_image/debug_result.jpg) - debug_crop: ![1.png](./res/doc_image/debug_crop_1.jpg) diff --git a/res/doc_image/debug_result.jpg b/res/doc_image/debug_result.jpg deleted file mode 100644 index 5edacfd75b4a0cd9cf397b17434b093ab8b0082a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58693 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 0 || newName.indexOf("\\\\") >= 0) { + targetPath = newName; + } else { + targetPath = file.getParentFile().getAbsolutePath() + "/" + newName; + } + File targetFile = new File(targetPath); file.renameTo(targetFile); return true; diff --git a/src/main/java/com/yuxue/util/ImageUtil.java b/src/main/java/com/yuxue/util/ImageUtil.java index 032bb7a9..84bec6f2 100644 --- a/src/main/java/com/yuxue/util/ImageUtil.java +++ b/src/main/java/com/yuxue/util/ImageUtil.java @@ -1,6 +1,5 @@ package com.yuxue.util; - import java.util.Arrays; import java.util.Map; import java.util.Set; @@ -9,6 +8,7 @@ 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.Scalar; import org.bytedeco.javacpp.opencv_core.Size; import org.bytedeco.javacpp.opencv_imgcodecs; import org.bytedeco.javacpp.opencv_imgproc; @@ -25,31 +25,53 @@ public class ImageUtil { private static String DEFAULT_BASE_TEST_PATH = "D:/PlateDetect/temp/"; + // 车牌定位处理步骤,该map用于表示步骤图片的顺序 + private static Map debugMap = Maps.newLinkedHashMap(); + static { + // debugMap.put("result", 99); + debugMap.put("gaussianBlur", 0); // 高斯模糊 + debugMap.put("gray", 1); // 图像灰度化 + debugMap.put("sobel", 2); // Sobel 算子 + debugMap.put("threshold", 3); //图像二值化 + debugMap.put("morphology", 4); // 图像闭操作 + debugMap.put("contours", 5); // 提取外部轮廓 + debugMap.put("result", 6); // 原图处理结果 + debugMap.put("crop", 7); // 切图 + debugMap.put("resize", 8); // 切图resize + debugMap.put("char_threshold", 9); // + // debugMap.put("char_clearLiuDing", 10); // 去除柳钉 + // debugMap.put("specMat", 11); + // debugMap.put("chineseMat", 12); + // debugMap.put("char_auxRoi", 13); + } + + public static void main(String[] args) { + + String filename = DEFAULT_BASE_TEST_PATH + "test.jpg"; + // String filename = DEFAULT_BASE_TEST_PATH + "test01.jpg"; String tempPath = DEFAULT_BASE_TEST_PATH + System.currentTimeMillis() + "/"; 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); + FileUtil.renameFile(filename, tempPath + "000_yuantu.jpg"); + + Mat inMat = opencv_imgcodecs.imread(filename); + Boolean debug = true; Mat gsMat = ImageUtil.gaussianBlur(inMat, debug, tempPath); - + Mat grey = ImageUtil.grey(gsMat, debug, tempPath); - + Mat sobel = ImageUtil.sobel(grey, debug, tempPath); - - - - + + // ImageUtil.rgb2Hsv(inMat, debug, tempPath); } - + /** * 高斯模糊 * @param inMat @@ -61,12 +83,12 @@ public class ImageUtil { Mat dst = new Mat(); opencv_imgproc.GaussianBlur(inMat, dst, new Size(DEFAULT_GAUSSIANBLUR_SIZE, DEFAULT_GAUSSIANBLUR_SIZE), 0, 0, opencv_core.BORDER_DEFAULT); if (debug) { - opencv_imgcodecs.imwrite(tempPath + "gaussianBlur.jpg", dst); + opencv_imgcodecs.imwrite(tempPath + (debugMap.get("gaussianBlur") + 100) + "_gaussianBlur.jpg", dst); } return dst; } - - + + /** * 将图像进行灰度化 * @param inMat @@ -78,12 +100,12 @@ public class ImageUtil { Mat dst = new Mat(); opencv_imgproc.cvtColor(inMat, dst, opencv_imgproc.CV_RGB2GRAY); if (debug) { - opencv_imgcodecs.imwrite(tempPath + "debugGray.jpg", dst); + opencv_imgcodecs.imwrite(tempPath + (debugMap.get("gray") + 100) + "_gray.jpg", dst); } return dst; } - - + + /** * 对图像进行Sobel 运算,得到图像的一阶水平方向导数 * @param inMat @@ -97,14 +119,14 @@ public class ImageUtil { public static final int SOBEL_X_WEIGHT = 1; public static final int SOBEL_Y_WEIGHT = 0; public static Mat sobel(Mat inMat, Boolean debug, String tempPath) { - + Mat dst = new Mat(); - + Mat grad_x = new Mat(); Mat grad_y = new Mat(); Mat abs_grad_x = new Mat(); Mat abs_grad_y = new Mat(); - + opencv_imgproc.Sobel(inMat, grad_x, SOBEL_DDEPTH, 1, 0, 3, SOBEL_SCALE, SOBEL_DELTA, opencv_core.BORDER_DEFAULT); opencv_core.convertScaleAbs(grad_x, abs_grad_x); @@ -113,15 +135,15 @@ public class ImageUtil { // Total Gradient (approximate) opencv_core.addWeighted(abs_grad_x, SOBEL_X_WEIGHT, abs_grad_y, SOBEL_Y_WEIGHT, 0, dst); - + if (debug) { - opencv_imgcodecs.imwrite(tempPath + "debugSobel.jpg", dst); + opencv_imgcodecs.imwrite(tempPath + (debugMap.get("sobel") + 100) + "_sobel.jpg", dst); } return dst; } - - - + + + /** * 对图像进行二值化。将灰度图像(每个像素点有256 个取值可能)转化为二值图像(每个像素点仅有1 和0 两个取值可能) * @param inMat @@ -133,12 +155,63 @@ public class ImageUtil { Mat dst = new Mat(); opencv_imgproc.threshold(inMat, dst, 0, 255, opencv_imgproc.CV_THRESH_OTSU + opencv_imgproc.CV_THRESH_BINARY); if (debug) { - opencv_imgcodecs.imwrite(tempPath + "debugThreshold.jpg", dst); + opencv_imgcodecs.imwrite(tempPath + (debugMap.get("threshold") + 100) + "_threshold.jpg", dst); + } + return dst; + } + + + + + + /** + * 使用闭操作。对图像进行闭操作以后,可以看到车牌区域被连接成一个矩形装的区域 + * @param inMat + * @param debug + * @param tempPath + * @return + */ + public static final int DEFAULT_MORPH_SIZE_WIDTH = 17; + public static final int DEFAULT_MORPH_SIZE_HEIGHT = 3; + public static Mat morphology(Mat inMat, Boolean debug, String tempPath) { + Mat dst = new Mat(); + Size size = new Size(DEFAULT_MORPH_SIZE_WIDTH, DEFAULT_MORPH_SIZE_HEIGHT); + + Mat element = opencv_imgproc.getStructuringElement(opencv_imgproc.MORPH_RECT, size); + opencv_imgproc.morphologyEx(inMat, dst, opencv_imgproc.MORPH_CLOSE, element); + + if (debug) { + opencv_imgcodecs.imwrite(tempPath + (debugMap.get("morphology") + 100) + "_morphology.jpg", dst); } return dst; } + /** + * Find 轮廓 of possibles plates 求轮廓。求出图中所有的轮廓。 + * 这个算法会把全图的轮廓都计算出来,因此要进行筛选。 + * @param src 原图 + * @param inMat morphology Mat + * @param debug + * @param tempPath + * @return + */ + public static MatVector contours(Mat src, Mat inMat, Boolean debug, String tempPath) { + MatVector contours = new MatVector(); + opencv_imgproc.findContours(inMat, contours, // a vector of contours + opencv_imgproc.CV_RETR_EXTERNAL, // 提取外部轮廓 + opencv_imgproc.CV_CHAIN_APPROX_NONE); // all pixels of each contours + + if (debug) { + // 将轮廓描绘到原图 + opencv_imgproc.drawContours(src, contours, -1, new Scalar(0, 0, 255, 255)); + opencv_imgcodecs.imwrite(tempPath + (debugMap.get("contours") + 100) + "_contours.jpg", src); + } + return contours; + } + + + /** @@ -157,13 +230,13 @@ public class ImageUtil { // 直方图均衡化是一种常见的增强图像对比度的方法,使用该方法可以增强局部图像的对比度,尤其在数据较为相似的图像中作用更加明显 opencv_imgproc.equalizeHist(hsvSplit.get(2), hsvSplit.get(2)); opencv_core.merge(hsvSplit, dst); - + if (debug) { opencv_imgcodecs.imwrite(tempPath + "hsvMat_"+System.currentTimeMillis()+".jpg", dst); } return dst; } - + /** * 获取HSV中各个颜色所对应的H的范围 @@ -175,7 +248,7 @@ public class ImageUtil { * @param debug */ public static void getHSVValue(Mat inMat, Boolean debug, String tempPath) { - + int channels = inMat.channels(); int nRows = inMat.rows(); // 图像数据列需要考虑通道数的影响; @@ -200,7 +273,6 @@ public class ImageUtil { } else { map.put(H, 1); } - } } @@ -214,5 +286,5 @@ public class ImageUtil { return; } - + }