Java opencv 识别身份证

Tesseract 是一个 OCR 库,  Tesseract 是目前公认最优秀、最精确的开源 OCR 系统,除了极高的精确度,Tesseract 也具有很高的灵活性。它可以通过训练识别出任何字体,也可以识别出任何 Unicode 字符。

1.安装Tesseract-OCR

1) 首先根据需求下载需要的Tesseract版本(3.0以上支持中文),本文以 tesseract-ocr-w64-setup-v4.0.0.20181030.exe 为例

        Tesseract下载: ​​​​​​Tesseract各版本下载

                a) 下载完毕后运行 .exe 文件,按提示进行安装 ;假设安装位置为: “C:\Program Files           (x86)\Tesseract-OCR”

                b) 增加系统变量 TESSDATA_PREFIX ,值为Tesseract-OCR 文件中的 tessdata 路                  径;此处为 “C:\Program Files (x86)\Tesseract-OCR\tessdata”

                c) 在 cmd 中输入 tesseract -v ,能正常显示版本信息则安装成功

        2) 下载对应版本的字库

        字库地址:各版本字库

        下载简体中文字库 chi_sim.traineddata ,英文字库 eng.traineddata 

        将文件放到 tessdata 文件夹中


2、安装OpenCV

Releases - OpenCV 进行下载

3、写代码

导入依赖

<!-- 加载lib目录下的opencv包 -->
        <dependency>
            <groupId>org.opencv</groupId>
            <artifactId>opencv</artifactId>
            <version>4.6.0</version>
            <scope>system</scope>
            <systemPath>E:\Programs\opencv\opencv\build\java\x86\opencv_java3416.dll</systemPath>
        </dependency>

        <dependency>
            <groupId>net.sourceforge.tess4j</groupId>
            <artifactId>tess4j</artifactId>
            <version>5.6.0</version>
        </dependency>
import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;
import org.junit.jupiter.api.Test;
import org.opencv.core.*;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import org.opencv.objdetect.CascadeClassifier;
import org.springframework.boot.test.context.SpringBootTest;

@Test
    void contextLoads() {

        String imagePath = "E:\\11\\1\\1107213262__haWGD.jpg";
        String imagePath1 = "E:\\11\\1\\1.jpg";
        String filename = "E:\\11\\1\\3.jpg";

//        System.load(JmxGenerate.COMMON_PATH + "opencv_java340-x64.dll");
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        // 加载图片
        Mat image = Imgcodecs.imread(imagePath);

        Rect rect = new Rect(252, 27, 122, 162);
        Mat roi_img = new Mat(image,rect);
        Mat tmp_img = new Mat();
        roi_img.copyTo(tmp_img);
        Imgcodecs.imwrite(filename, tmp_img);


//         初始化 tesseract OCR 引擎
        Tesseract tesseract = new Tesseract();

        tesseract.setDatapath("E:\\Programs\\Tesseract-OCR\\tessdata");
        tesseract.setLanguage("chi_sim");


// 识别身份证信息

        File file = new File(filename);

        try {
            String s = tesseract.doOCR(file);
            System.out.println(s);
        } catch (TesseractException e) {
            e.printStackTrace();
        }

    }

图像切割要求精细化,一张图片上文字越少,识别越精准

4、人脸识别对比

//初始化人脸探测器
    static CascadeClassifier faceDetector;

    static {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        faceDetector = new CascadeClassifier(
                "E:\\Programs\\opencv\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_alt.xml");
    }


@Test
    void  test4(){
        String s1 = "E:\\11\\1\\55.jpg";
        String s2 = "E:\\11\\1\\66.jpg";
        double compareHist = compare_image(s1, s2);
        System.out.println(compareHist);
        if (compareHist > 0.72) {
            System.out.println("人脸匹配");
        } else {
            System.out.println("人脸不匹配");
        }
    }

    public static double compare_image(String img_1, String img_2) {
        Mat mat_1 = conv_Mat(img_1);
        Mat mat_2 = conv_Mat(img_2);

        Mat hist_1 = new Mat();
        Mat hist_2 = new Mat();

        //颜色范围
        MatOfFloat ranges = new MatOfFloat(0f, 256f);
        //直方图大小, 越大匹配越精确 (越慢)
        MatOfInt histSize = new MatOfInt(1000);

        Imgproc.calcHist(Arrays.asList(mat_1), new MatOfInt(0), new Mat(), hist_1, histSize, ranges);
        Imgproc.calcHist(Arrays.asList(mat_2), new MatOfInt(0), new Mat(), hist_2, histSize, ranges);

        // CORREL 相关系数
        double res = Imgproc.compareHist(hist_1, hist_2, Imgproc.CV_COMP_CORREL);
        return res;
    }

    private static Mat conv_Mat(String img_1) {
        Mat image0 = Imgcodecs.imread(img_1);

        Mat image = new Mat();
        //灰度转换
        Imgproc.cvtColor(image0, image, Imgproc.COLOR_BGR2GRAY);

        MatOfRect faceDetections = new MatOfRect();
        //探测人脸
        faceDetector.detectMultiScale(image, faceDetections);

        // rect中是人脸图片的范围
        for (Rect rect : faceDetections.toArray()) {
            //切割rect人脸
            Mat mat = new Mat(image, rect);
            return mat;
        }
        return null;
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值