diff --git a/src/main/java/com/acts/opencv/base/BaseMethodController.java b/src/main/java/com/acts/opencv/base/BaseMethodController.java index 205091e..86f2234 100644 --- a/src/main/java/com/acts/opencv/base/BaseMethodController.java +++ b/src/main/java/com/acts/opencv/base/BaseMethodController.java @@ -348,6 +348,43 @@ public class BaseMethodController extends BaseController { } } + /** + * 漫水填充 + * @Author 王嵩 + * @param response + * @param imagefile + * @param ksize + * @param alpha + * @param beta + * @param gamma void + * @Date 2018年5月24日 + * 更新日志 + * 2018年5月24日 王嵩 首次创建 + * + */ + @RequestMapping(value = "floodfill") + public void floodfill(HttpServletResponse response, String imagefile, double graysize, double lodiff, + double updiff, int flag) { + System.loadLibrary(Core.NATIVE_LIBRARY_NAME); + logger.info("\n 锐化操作"); + + String sourcePath = Constants.PATH + imagefile; + logger.info("url==============" + sourcePath); + Mat source = Highgui.imread(sourcePath, Highgui.CV_LOAD_IMAGE_GRAYSCALE); + // Mat mask = new Mat(source.rows() + 2, source.cols() + 2, source.type()); + Mat mask = new Mat(); + Rect rect = new Rect(); + Imgproc.floodFill(source, mask, new Point(0, 0), new Scalar(graysize), rect, new Scalar(lodiff), new Scalar( + updiff), flag); + + try { + byte[] imgebyte = OpenCVUtil.covertMat2Byte1(source); + renderImage(response, imgebyte); + } catch (IOException e) { + e.printStackTrace(); + } + } + /** * 图片缩放方法测试 * 创建者 Songer @@ -733,7 +770,7 @@ public class BaseMethodController extends BaseController { logger.info("轮廓数量已经超出,默认显示所有轮廓,轮廓数量:{}", contours.size()); contourNum = -1; } - Imgproc.drawContours(destination, contours, contourNum, new Scalar(0, 255, 0), 2); + Imgproc.drawContours(destination, contours, contourNum, new Scalar(0, 255, 0), 1); try { byte[] imgebyte = OpenCVUtil.covertMat2Byte1(destination); renderImage(response, imgebyte); @@ -894,4 +931,121 @@ public class BaseMethodController extends BaseController { } } + + // public void qrCode(HttpServletResponse response, String imagefile, Integer binaryType, Double thresh, Double maxval) { + // System.loadLibrary(Core.NATIVE_LIBRARY_NAME); + // String sourcePath = Constants.PATH + imagefile; + // // 加载为灰度图显示 + // Mat imageGray = Highgui.imread(sourcePath, Highgui.CV_LOAD_IMAGE_GRAYSCALE); + // Mat image = new Mat(imageGray.rows(), imageGray.cols(), imageGray.type()); + // Mat imageGuussian = new Mat(imageGray.rows(), imageGray.cols(), imageGray.type()); + // Mat imageSobelX,imageSobelY,imageSobelOut; + // imageGray.copyTo(image); + // + // // imshow("Source Image",image); + // + // GaussianBlur(imageGray,imageGuussian,Size(3,3),0); + // Imgproc.GaussianBlur(imageGray, imageGuussian,new Size(5, 5), + // Integer.valueOf(sigmaX), Integer.valueOf(sigmaY)); + // + // //水平和垂直方向灰度图像的梯度和,使用Sobel算子 + // Mat imageX16S,imageY16S; + // Sobel(imageGuussian,imageX16S,CV_16S,1,0,3,1,0,4); + // Sobel(imageGuussian,imageY16S,CV_16S,0,1,3,1,0,4); + // convertScaleAbs(imageX16S,imageSobelX,1,0); + // convertScaleAbs(imageY16S,imageSobelY,1,0); + // imageSobelOut=imageSobelX+imageSobelY; + // imshow("XY方向梯度和",imageSobelOut); + // Mat srcImg =imageSobelOut; + // //宽高扩充,非必须,特定的宽高可以提高傅里叶运算效率 + // Mat padded; + // int opWidth = getOptimalDFTSize(srcImg.rows); + // int opHeight = getOptimalDFTSize(srcImg.cols); + // copyMakeBorder(srcImg, padded, 0, opWidth-srcImg.rows, 0, opHeight-srcImg.cols, BORDER_CONSTANT, Scalar::all(0)); + // Mat planes[] = {Mat_(padded), Mat::zeros(padded.size(), CV_32F)}; + // Mat comImg; + // //通道融合,融合成一个2通道的图像 + // merge(planes,2,comImg); + // dft(comImg, comImg); + // split(comImg, planes); + // magnitude(planes[0], planes[1], planes[0]); + // Mat magMat = planes[0]; + // magMat += Scalar::all(1); + // log(magMat, magMat); //对数变换,方便显示 + // magMat = magMat(Rect(0, 0, magMat.cols & -2, magMat.rows & -2)); + // //以下把傅里叶频谱图的四个角落移动到图像中心 + // int cx = magMat.cols/2; + // int cy = magMat.rows/2; + // Mat q0(magMat, Rect(0, 0, cx, cy)); + // Mat q1(magMat, Rect(0, cy, cx, cy)); + // Mat q2(magMat, Rect(cx, cy, cx, cy)); + // Mat q3(magMat, Rect(cx, 0, cx, cy)); + // Mat tmp; + // q0.copyTo(tmp); + // q2.copyTo(q0); + // tmp.copyTo(q2); + // q1.copyTo(tmp); + // q3.copyTo(q1); + // tmp.copyTo(q3); + // normalize(magMat, magMat, 0, 1, CV_MINMAX); + // Mat magImg(magMat.size(), CV_8UC1); + // magMat.convertTo(magImg,CV_8UC1,255,0); + // imshow("傅里叶频谱", magImg); + // //HoughLines查找傅里叶频谱的直线,该直线跟原图的一维码方向相互垂直 + // threshold(magImg,magImg,180,255,CV_THRESH_BINARY); + // imshow("二值化", magImg); + // vector lines; + // float pi180 = (float)CV_PI/180; + // Mat linImg(magImg.size(),CV_8UC3); + // HoughLines(magImg,lines,1,pi180,100,0,0); + // int numLines = lines.size(); + // float theta; + // for(int l=0; lget_type_name()<get_data()< images = new ArrayList<>(); + List images = new ArrayList(); images.add(img); MatOfInt channels = new MatOfInt(0); // 图像通道数,0表示只有一个通道 MatOfInt histSize = new MatOfInt(256); // CV_8U类型的图片范围是0~255,共有256个灰度级 diff --git a/src/main/java/com/acts/opencv/common/mapper/BeanMapper.java b/src/main/java/com/acts/opencv/common/mapper/BeanMapper.java index 71e2683..ee6a53c 100644 --- a/src/main/java/com/acts/opencv/common/mapper/BeanMapper.java +++ b/src/main/java/com/acts/opencv/common/mapper/BeanMapper.java @@ -12,6 +12,7 @@ import com.google.common.collect.Lists; * 2. 返回值类型转换. * 3. 批量转换Collection中的所有对象. * 4. 区分创建新的B对象与将对象A值复制到已存在的B对象两种函数. + * 创建者 张志朋 * 创建时间 2017年9月28日 */ public class BeanMapper { diff --git a/src/main/java/com/acts/opencv/common/mapper/JaxbMapper.java b/src/main/java/com/acts/opencv/common/mapper/JaxbMapper.java index 72e55a3..72792d6 100644 --- a/src/main/java/com/acts/opencv/common/mapper/JaxbMapper.java +++ b/src/main/java/com/acts/opencv/common/mapper/JaxbMapper.java @@ -25,6 +25,7 @@ import com.acts.opencv.common.utils.Reflections; * 使用Jaxb2.0实现XML<->Java Object的Mapper. * 在创建时需要设定所有需要序列化的Root对象的Class. * 特别支持Root对象是Collection的情形. + * 创建者 张志朋 * 创建时间 2017年9月28日 * */ diff --git a/src/main/java/com/acts/opencv/common/mapper/JsonMapper.java b/src/main/java/com/acts/opencv/common/mapper/JsonMapper.java index 1d0463d..24447ec 100644 --- a/src/main/java/com/acts/opencv/common/mapper/JsonMapper.java +++ b/src/main/java/com/acts/opencv/common/mapper/JsonMapper.java @@ -15,8 +15,8 @@ import org.slf4j.LoggerFactory; import com.fasterxml.jackson.annotation.JsonInclude.Include; import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.core.JsonParser.Feature; import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.JsonParser.Feature; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.JsonSerializer; @@ -29,6 +29,7 @@ import com.fasterxml.jackson.module.jaxb.JaxbAnnotationModule; /** * 简单封装Jackson,实现JSON String<->Java Object的Mapper. 封装不同的输出风格, * 使用不同的builder函数创建实例. + * 创建者 张志朋 * 创建时间 2017年9月28日 * */ diff --git a/src/main/java/com/acts/opencv/common/mapper/adapters/MapAdapter.java b/src/main/java/com/acts/opencv/common/mapper/adapters/MapAdapter.java index 4a79cb0..bc23be0 100644 --- a/src/main/java/com/acts/opencv/common/mapper/adapters/MapAdapter.java +++ b/src/main/java/com/acts/opencv/common/mapper/adapters/MapAdapter.java @@ -1,3 +1,6 @@ +/** + * Copyright © 2016-2020 公众学业 All rights reserved. + */ package com.acts.opencv.common.mapper.adapters; import java.util.HashMap; diff --git a/src/main/java/com/acts/opencv/common/mapper/adapters/MapConvertor.java b/src/main/java/com/acts/opencv/common/mapper/adapters/MapConvertor.java index 470611d..e867a73 100644 --- a/src/main/java/com/acts/opencv/common/mapper/adapters/MapConvertor.java +++ b/src/main/java/com/acts/opencv/common/mapper/adapters/MapConvertor.java @@ -1,3 +1,6 @@ +/** + * Copyright © 2016-2020 公众学业 All rights reserved. + */ package com.acts.opencv.common.mapper.adapters; import java.util.ArrayList; @@ -12,7 +15,7 @@ import javax.xml.bind.annotation.XmlType; @XmlAccessorType(XmlAccessType.FIELD) public class MapConvertor { - private final List entries = new ArrayList(); + private List entries = new ArrayList(); public void addEntry(MapEntry entry) { entries.add(entry); diff --git a/src/main/java/com/acts/opencv/common/utils/Reflections.java b/src/main/java/com/acts/opencv/common/utils/Reflections.java index f7e015d..bba3a46 100644 --- a/src/main/java/com/acts/opencv/common/utils/Reflections.java +++ b/src/main/java/com/acts/opencv/common/utils/Reflections.java @@ -11,23 +11,22 @@ import org.apache.commons.lang3.Validate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.util.Assert; - /** * 反射工具类. * 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class, 被AOP过的真实类等工具函数. - * 创建者 Songer + * 创建者 张志朋 * 创建时间 2016年8月1日 * */ @SuppressWarnings("rawtypes") public class Reflections { - + private static final String SETTER_PREFIX = "set"; private static final String GETTER_PREFIX = "get"; private static final String CGLIB_CLASS_SEPARATOR = "$$"; - + private static Logger logger = LoggerFactory.getLogger(Reflections.class); /** @@ -136,7 +135,7 @@ public class Reflections { /** * 循环向上转型, 获取对象的DeclaredField, 并强制设置为可访问. - * + * * 如向上转型到Object仍无法找到, 返回null. */ public static Field getAccessibleField(final Object obj, final String fieldName) { @@ -159,7 +158,7 @@ public class Reflections { * 循环向上转型, 获取对象的DeclaredMethod,并强制设置为可访问. * 如向上转型到Object仍无法找到, 返回null. * 匹配函数名+参数类型。 - * + * * 用于方法需要被多次调用的情况. 先使用本函数先取得Method,然后调用Method.invoke(Object obj, Object... args) */ public static Method getAccessibleMethod(final Object obj, final String methodName, @@ -184,7 +183,7 @@ public class Reflections { * 循环向上转型, 获取对象的DeclaredMethod,并强制设置为可访问. * 如向上转型到Object仍无法找到, 返回null. * 只匹配函数名。 - * + * * 用于方法需要被多次调用的情况. 先使用本函数先取得Method,然后调用Method.invoke(Object obj, Object... args) */ public static Method getAccessibleMethodByName(final Object obj, final String methodName) { @@ -240,7 +239,7 @@ public class Reflections { /** * 通过反射, 获得Class定义中声明的父类的泛型参数的类型. * 如无法找到, 返回Object.class. - * + * * 如public UserDao extends HibernateDao * * @param clazz clazz The class to introspect @@ -270,7 +269,7 @@ public class Reflections { return (Class) params[index]; } - + public static Class getUserClass(Object instance) { Assert.notNull(instance, "Instance must not be null"); Class clazz = instance.getClass(); @@ -283,7 +282,7 @@ public class Reflections { return clazz; } - + /** * 将反射时的checked exception转换为unchecked exception. */ diff --git a/src/main/webapp/index.jsp b/src/main/webapp/index.jsp index 826f9e4..1242043 100644 --- a/src/main/webapp/index.jsp +++ b/src/main/webapp/index.jsp @@ -130,6 +130,7 @@ desired effect
  • zxing识别二维码
  • 模糊
  • 图像锐化
  • +
  • 漫水填充
  • 缩放
  • 腐蚀膨胀
  • 腐蚀膨胀进阶
  • @@ -156,7 +157,7 @@ desired effect
  • 页码识别
  • 图像矫正
  • - +
  • 校正真实测试
  • diff --git a/src/main/webapp/statics/sourceimage/floodfill.png b/src/main/webapp/statics/sourceimage/floodfill.png new file mode 100644 index 0000000..4542bf2 Binary files /dev/null and b/src/main/webapp/statics/sourceimage/floodfill.png differ diff --git a/src/main/webapp/statics/sourceimage/floodfill3.png b/src/main/webapp/statics/sourceimage/floodfill3.png new file mode 100644 index 0000000..97e482b Binary files /dev/null and b/src/main/webapp/statics/sourceimage/floodfill3.png differ diff --git a/src/main/webapp/statics/sourceimage/match3.jpg b/src/main/webapp/statics/sourceimage/match3.jpg new file mode 100644 index 0000000..4806c21 Binary files /dev/null and b/src/main/webapp/statics/sourceimage/match3.jpg differ diff --git a/src/main/webapp/view/base/findtemplate.jsp b/src/main/webapp/view/base/findtemplate.jsp index c4dba10..60e675a 100644 --- a/src/main/webapp/view/base/findtemplate.jsp +++ b/src/main/webapp/view/base/findtemplate.jsp @@ -81,7 +81,7 @@ console.log("init",[xsize,ysize]); $("#oldimg").Jcrop({ - maxSize:[100,62], + maxSize:[100,100], onChange: updatePreview, onSelect: updatePreview, aspectRatio: xsize / ysize @@ -163,7 +163,7 @@ /* width: 250px; height: 170px; */ width: 100px; - height: 62px; + height: 100px; overflow: hidden; } diff --git a/src/main/webapp/view/base/floodfill.jsp b/src/main/webapp/view/base/floodfill.jsp new file mode 100644 index 0000000..e2e08dd --- /dev/null +++ b/src/main/webapp/view/base/floodfill.jsp @@ -0,0 +1,227 @@ +<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> +<%@include file="/module/include/common.jsp"%> + + + + + + + + + +
    + +
    + +
    +
    +

    参考资料:
    + Opencv官方文档:addweighted
    +
    锐化:dst (I)= saturate ( src1(I)* lodiff + src2(I)* updiff + flag ) + public static void addWeighted(Mat src1, double lodiff, Mat src2, double updiff, double flag, Mat dst); 各参数说明:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    #参数说明
    1.Mat src1图层1对应的Mat对象
    2.double lodiff图层1的透明度权重
    3.Mat src2图层2对应的Mat对象
    4.double updiff图层2的透明度权重
    5.double flag一个加到权重总和上的标量值,越大合并图像越明亮
    6.Mat dst目标图像mat
    + + +
    +
    +
    +
    + + +

      漫水填充测试

    +
    + + + + + + + + + + + + + + + +
    灰度值lodiffupdiffflag操作
    + + + + + + + + 漫水填充 + 重置
    + + + + +
    +
    +
    +
    +

    原图

    + +
    +
    +

    未识别前的原文件。

    + 原图 +
    +
    +
    +
    +
    +
    +

    识别后的图片

    + +
    +
    +

    点击识别按钮后,将显示识别后的文件。

    + 识别后的图 + +
    +
    +
    +
    + + + + +