java调用opencv身份证号识别详解
更新时间:2024年03月06日 10:36:08 作者:冒泡的肥皂
这篇文章主要为大家详细介绍了java如何调用opencv实现身份证号的识别,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
一、实现思路
1.矫正图片 这个可以参考上篇文章 Java调用opencv图片矫正
2.因为身份证大小是固定的 这里可以按照比例截取身份证号的区域
3.把截取图像用tess4j进行识别
4.效果图
二、部分代码
2.1图片剪辑
public static Mat cutRect(Mat image) { Mat clone=image.clone(); Mat src=image.clone(); Imgproc.GaussianBlur(clone, clone, new Size(3, 3), 0, 0); HighGui.imshow("GaussianBlur1", clone); Imgproc.cvtColor(clone, clone,Imgproc.COLOR_BGR2GRAY); HighGui.imshow("GRY1", clone); int lowThresh=20; //边缘检测 Imgproc.Canny(clone, clone,lowThresh, lowThresh*3,3); HighGui.imshow("Canny1", clone); List<MatOfPoint> contours = new ArrayList<MatOfPoint>(); Mat hierarchy = new Mat(); // 寻找轮廓 Imgproc.findContours(clone, contours, hierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_NONE); System.out.println("轮廓:"+contours.size()); // 找出匹配到的最大轮廓 double area = Imgproc.boundingRect(contours.get(0)).area(); int index = 0; // 找出匹配到的最大轮廓 for (int i = 0; i < contours.size(); i++) { double tempArea = Imgproc.boundingRect(contours.get(i)).area(); if (tempArea > area) { area = tempArea; index = i; } } MatOfPoint2f matOfPoint2f = new MatOfPoint2f(contours.get(index).toArray()); RotatedRect rect = Imgproc.minAreaRect(matOfPoint2f); Mat temp = new Mat(src , rect.boundingRect()); Mat t = new Mat(); temp.copyTo(t); HighGui.imshow("cut", temp); return t; }
2.2身份证提取位置
public static String card(Mat mat){ Point point1=new Point(mat.cols()*0.34,mat.rows()*0.80); Point point2=new Point(mat.cols()*0.34,mat.rows()*0.80); Point point3=new Point(mat.cols()*0.89,mat.rows()*0.91); Point point4=new Point(mat.cols()*0.89,mat.rows()*0.91); List<Point> list=new ArrayList<>(); list.add(point1); list.add(point2); list.add(point3); list.add(point4); Mat card= shear(mat,list); card=ImageUtil.drawContours(card,50); HighGui.imshow("card", card); //高斯滤波 Imgproc.cvtColor(card, card,Imgproc.COLOR_BGR2GRAY); Imgproc.GaussianBlur(card, card, new Size(3, 3), 0, 0); Imgproc.threshold(card, card, 165, 255, Imgproc.THRESH_BINARY); //Imgproc.Canny(image, image,lowThresh, lowThresh*3,3); System.out.println(ImageUtil.getImageMessage(Mat2BufImg(card,".jpg"),"eng")); return null; }
2.3图片数字识别 tess4j
pom
<dependency> <groupId>net.sourceforge.tess4j</groupId> <artifactId>tess4j</artifactId> <version>4.5.4</version> </dependency>
public static String getImageMessage(BufferedImage img,String language){ String result=""; try{ ITesseract instance = new Tesseract(); instance.setTessVariable("user_defined_dpi", "300"); //语言包的位置 File tessDataFolder = new File("E:\\tessdata-master"); instance.setLanguage(language); instance.setDatapath(tessDataFolder.getAbsolutePath()); result = instance.doOCR(img); System.out.println(result); }catch(Exception e){ e.printStackTrace(); } return result; }
到此这篇关于java调用opencv身份证号识别详解的文章就介绍到这了,更多相关java opencv身份证号识别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Java多线程导致CPU占用100%解决及线程池正确关闭方式
1000万表数据导入内存数据库,按分页大小10000查询,多线程,15条线程跑,最后发现CPU占用100%卡死,那么如何解决,本文就来介绍一下,感兴趣的朋友可以了解一下2021-05-05从dubbo zookeeper注册地址提取出zookeeper地址的方法
今天小编就为大家分享一篇关于从dubbo zookeeper注册地址提取出zookeeper地址的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧2018-12-12浅谈mybatisPlus的Ipage分页和map参数的问题
这篇文章主要介绍了mybatisPlus的Ipage分页和map参数的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-12-12
最新评论