• 图像处理04


    折腾了一大圈,最后还是移植到java上了…………

    插段代码留个底。

      1 import net.sourceforge.tess4j.ITesseract;
      2 import net.sourceforge.tess4j.Tesseract;
      3 import org.opencv.core.*;
      4 import org.opencv.imgproc.Imgproc;
      5 
      6 import javax.imageio.ImageIO;
      7 import java.awt.image.BufferedImage;
      8 import java.io.ByteArrayInputStream;
      9 import java.io.InputStream;
     10 import java.util.ArrayList;
     11 import java.util.HashMap;
     12 import java.util.List;
     13 import java.util.Map;
     14 
     15 import static org.opencv.imgcodecs.Imgcodecs.imencode;
     16 import static org.opencv.imgcodecs.Imgcodecs.imread;
     17 import static org.opencv.imgcodecs.Imgcodecs.imwrite;
     18 import static org.opencv.imgproc.Imgproc.*;
     19 
     20 public class textDetection {
     21     static {
     22         System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
     23     }
     24 
     25     public static ITesseract instance = new Tesseract();
     26 
     27     public static void main(String[] args) {
     28         System.out.println("hello");
     29 
     30         //ocr初始化
     31         instance.setDatapath("C:\Program Files (x86)\Tesseract-OCR\tessdata");
     32         //此处的-psm 7为参数,指定了识别目标为单行从左到右的字母,增加该参数可以提高识别率。
     33         //但是不知道java怎么加这个参数。
     34 //        List<String> config=new ArrayList<String>();
     35 //        config.add("-psm 7");
     36 //        instance.setConfigs(config);
     37 
     38         //文字提取和识别
     39         Mat img = imread("test2.jpg");
     40         List<Mat> pre = preprocess(img);
     41         imwrite("test_1.jpg", pre.get(0));
     42         Map<Rect, String> region = dectection(pre.get(0), pre.get(1));
     43  57     }
     58 
     59 //    图片预处理
     60     //返回值中,0为二值化结果,1为腐蚀膨胀后的结果
     61     public static List<Mat> preprocess(Mat img) {
     62         List<Mat> re=new ArrayList<Mat>();
     63         Mat gray = new Mat();
     64         cvtColor(img, gray, COLOR_BGR2GRAY);
     65         Mat th = new Mat();
     66         Imgproc.threshold(gray, th, 48, 255, THRESH_BINARY_INV);
     67         re.add(th);
     68 
     69         Mat element1=getStructuringElement(MORPH_RECT, new Size(10,10));
     70         Mat element2=getStructuringElement(MORPH_RECT, new Size(30,30));
     71 
     72         //腐蚀和膨胀
     73         Mat erosion=new Mat();
     74         erode(th, erosion, element1);
     75         Mat dilation=new Mat();
     76         dilate(erosion, dilation, element2);
     77         Mat dilation2=new Mat();
     78         dilate(dilation, dilation2, element2);
     79         Mat dilation3=new Mat();
     80         dilate(dilation2, dilation3, element2);
     81         re.add(dilation3);
     82 
     83         //中间图输出
     84 //        imwrite("binary.png", th);
     85 //        imwrite("dilation.png", dilation);
     86 //        imwrite("erosion.png", erosion);
     87 //        imwrite("dilation2.png", dilation2);
     88 
     89 
     90         return re;
     91     }
     92 
     93 //    文字提取和识别
     94     //参数img为二值化结果,用于文字识别。position为腐蚀膨胀结果,用于文字提取。
     95     //返回值为矩形框和其对应的文字识别结果的map
     96     public static Map<Rect, String> dectection(Mat img, Mat position) {
     97         List<MatOfPoint> pointlist=new ArrayList<MatOfPoint>();
     98         Mat mat=new Mat();
     99         findContours(position, pointlist, mat, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
    100         int i=1;
    101         Map<Rect, String> re=new HashMap<Rect, String>();
    102         for (MatOfPoint point:pointlist) {
    103             Rect rect = boundingRect(point);
    104             System.out.println(i+" "+rect.x+" "+rect.y+" "+rect.width+" "+rect.height);
    105             i++;
    106             rectangle(img, new Point(rect.x, rect.y), new Point(rect.x+rect.width, rect.y+rect.height), new Scalar(255, 0, 0));
    107             Mat sub_mat=img.submat(rect.y, rect.y+rect.height, rect.x, rect.x+rect.width);
    108             BufferedImage bimage=getImage(sub_mat);
    109             try {
    110                 String answer = instance.doOCR(bimage);
    111                 //System.out.println(answer);
    112                 re.put(rect, answer);
    113             } catch (Exception e) {
    114                 e.printStackTrace();
    115             }
    116         }
    117         //imwrite("test_2.jpg", img);
    118         return re;
    119     }
    120 
    121 //    mat转bufferedimage
    122     public static BufferedImage getImage(Mat img) {
    123         MatOfByte mob= new MatOfByte();
    124         imencode(".jpg", img, mob);
    125         byte[] byteArray = mob.toArray();
    126         BufferedImage bufImage = null;
    127         try {
    128             InputStream in = new ByteArrayInputStream(byteArray);
    129             bufImage = ImageIO.read(in);
    130         } catch (Exception e) {
    131             e.printStackTrace();
    132         }
    133         return bufImage;
    134     }
    135 166 
    167     //两点距离
    168     public static Double dis(Double[] a, Double[] b) {
    169         return Math.sqrt(dis_s(a, b));
    170     }
    171 
    172     //两点距离的平方
    173     public static Double dis_s(Double[] a, Double[] b) {
    174         return ((a[0]-b[0])*(a[0]-b[0])+(a[1]-b[1])*(a[1]-b[1]));
    175     }
    176 
    177 }
  • 相关阅读:
    机器学习项目流程(二)探索并可视化数据
    机器学习项目流程(一)初探数据集
    数据类型.md
    keepalived.md
    LVS.md
    tomcat多实例.md
    LANMP常用配置.md
    php-fpm配置参数.md
    Nginx学习.md
    Redis.md
  • 原文地址:https://www.cnblogs.com/wangzhao765/p/8276313.html
Copyright © 2020-2023  润新知