package com.nbsl.cv.utils;
import java.awt.AlphaComposite;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import javax.imageio.ImageIO;
import org.bytedeco.javacpp.BytePointer;
import org.bytedeco.javacpp.opencv_core;
import org.bytedeco.javacpp.opencv_core.Mat;
import org.bytedeco.javacpp.opencv_core.MatExpr;
import org.bytedeco.javacpp.opencv_core.MatVector;
import org.bytedeco.javacpp.opencv_core.Point;
import org.bytedeco.javacpp.opencv_core.Point2d;
import org.bytedeco.javacpp.opencv_core.Point2f;
import org.bytedeco.javacpp.opencv_core.PointVector;
import org.bytedeco.javacpp.opencv_core.Rect;
import org.bytedeco.javacpp.opencv_core.RectVector;
import org.bytedeco.javacpp.opencv_core.RotatedRect;
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;
import org.bytedeco.javacpp.opencv_objdetect.CascadeClassifier;
import org.bytedeco.javacpp.indexer.ByteArrayIndexer;
import org.bytedeco.javacpp.indexer.ByteIndexer;
import org.bytedeco.javacpp.indexer.DoubleArrayIndexer;
import org.bytedeco.javacpp.indexer.DoubleIndexer;
import org.bytedeco.javacpp.indexer.IntIndexer;
import org.bytedeco.javacpp.indexer.IntRawIndexer;
import org.bytedeco.javacpp.indexer.UByteRawIndexer;
public class OpencvUtil {
private static final int BLACK = 0;
private static final int WHITE = 255;
public static Mat flow(Mat mat) {
// 灰度
mat = OpencvUtil.gray(mat);
// 二值化 此处绝定图片的清晰度
mat = OpencvUtil.binary(mat);
// 腐蚀 去除背景图片
mat = OpencvUtil.erode(mat, 1);
return mat;
}
/**
* 灰化处理
*
* @return
*/
public static Mat gray(Mat mat) {
Mat gray = new Mat();
opencv_imgproc.cvtColor(mat, gray, opencv_imgproc.COLOR_BGR2GRAY, 1);
return gray;
}
/**
* 增强对比
* @param mat
* @return
*/
public static Mat splitBGR(Mat mat) {
MatVector splitBGR = new MatVector();
opencv_core.split(mat, splitBGR);
for (int i = 0; i<mat.channels(); i++){
opencv_imgproc.equalizeHist(splitBGR.get(i), splitBGR.get(i));
}
opencv_core.merge(splitBGR, mat);
return mat;
}
/**
* 二值化处理
*参数1:InputArray类型的src,输入图像,填单通道,单8位浮点类型Mat即可。
参数2:函数运算后的结果存放在这。即为输出图像(与输入图像同样的尺寸和类型)。
参数3:预设满足条件的最大值。
参数4:指定自适应阈值算法。可选择ADAPTIVE_THRESH_MEAN_C 或 ADAPTIVE_THRESH_GAUSSIAN_C两种。(具体见下面的解释)。
参数5:指定阈值类型。可选择THRESH_BINARY或者THRESH_BINARY_INV两种。(即二进制阈值或反二进制阈值)。
参数6:表示邻域块大小,用来计算区域阈值,一般选择为3、5、7......等。
参数7:参数C表示与算法有关的参数,它是一个从均值或加权均值提取的常数,可以是负数。(具体见下面的解释)。
* @return
*/
public static Mat binary(Mat mat) {
Mat binary = new Mat();
// 高斯平滑滤波器卷积降噪
//opencv_imgproc.GaussianBlur(mat, mat, new Size(3,3), 0);
opencv_imgproc.adaptiveThreshold(mat, binary, 255, opencv_imgproc.ADAPTIVE_THRESH_GAUSSIAN_C,
opencv_imgproc.THRESH_BINARY_INV, 7, 10);
return binary;
}
/**
* 模糊处理
*
* @param mat
* @return
*/
public static Mat blur(Mat mat) {
Mat blur = new Mat();
opencv_imgproc.blur(mat, blur, new Size(5, 5));
return blur;
}
/**
* 膨胀
*
* @param mat
* @return
*/
public static Mat dilate(Mat mat, int size) {
Mat dilate = new Mat();
Mat element = opencv_imgproc.getStructuringElement(opencv_imgproc.MORPH_RECT, new Size(size, size));
// 膨胀
opencv_imgproc.dilate(mat, dilate, element); // , new Point(-1, -1), 1
return dilate;
}
/**
* 腐蚀
*
* @param mat
* @return
*/
public static Mat erode(Mat mat, int size) {
Mat erode = new Mat();
Mat element = opencv_imgproc.getStructuringElement(opencv_imgproc.MORPH_RECT, new Size(size, size));
// 腐蚀
opencv_imgproc.erode(mat, erode, element);// , new Point(-1, -1), 1
return erode;
}
/**
* 边缘检测
*
* @param mat
* @return
*/
public static Mat carry(Mat mat) {
Mat dst = new Mat();
// 高斯平滑滤波器卷积降噪
opencv_imgproc.GaussianBlur(mat, dst, new Size(3, 3), 0);
// 边缘检测
//opencv_imgcodecs.imwrite("F:/face/1.jpg", dst);
opencv_imgproc.Canny(mat, dst, 50, 150);
//opencv_imgcodecs.imwrite("F:/face/2.jpg", dst);
return dst;
}
/**
* 轮廓检测
*定义轮廓的检索模式,取值如下:
CV_RETR_EXTERNAL:只检测最外围轮廓,包含在外围轮廓内的内围轮廓被忽略;
CV_RETR_LIST:检测所有的轮廓,包括内围、外围轮廓,但是检测到的轮廓不建立等级关系,彼此之间独立,没有等级关系,这就意味着这个检索模式下不存在父轮廓或内嵌轮廓,所以hierarchy向量内所有元素的第3、第4个分量都会被置为-1,具体下文会讲到;
CV_RETR_CCOMP: 检测所有的轮廓,但所有轮廓只建立两个等级关系,外围为顶层,若外围内的内围轮廓还包含了其他的轮廓信息,则内围内的所有轮廓均归属于顶层;
CV_RETR_TREE: 检测所有轮廓,所有轮廓建立一个等级树结构。外层轮廓包含内层轮廓,内层轮廓还可以继续包含内嵌轮廓。
参数5:定义轮廓的近似方法,取值如下:
CV_CHAIN_APPROX_NONE:保存物体边界上所有连续的轮廓点到contours向量内;
CV_CHAIN_APPROX_SIMPLE:仅保存轮廓的拐点信息,把所有轮廓拐点处的点保存入contours向量内,拐点与拐点之间直线段上的信息点不予保留;
CV_CHAIN_APPROX_TC89_L1:使用teh-Chinl chain 近似算法;
CV_CHAIN_APPROX_TC89_KCOS:使用teh-Chinl chain 近似算法。
* @param mat
* @return
*/
public static MatVector findContours(Mat mat) {
MatVector contours = new MatVector();
Mat hierarchy = new Mat();
/*opencv_imgproc.findContours(mat, contours, hierarchy, opencv_imgproc.RETR_LIST,
opencv_imgproc.CHAIN_APPROX_SIMPLE);*/
opencv_imgproc.findContours(mat, contours, hierarchy, opencv_imgproc.RETR_LIST,
opencv_imgproc.CHAIN_APPROX_SIMPLE);
return contours;
}
/**
* 清除小面积轮廓
*
* @param mat
* @param size
* @return
*/
public static Mat drawContours(Mat mat, int size) {
MatVector cardContours = OpencvUtil.findContours(mat);
for (int i = 0; i < cardContours.size(); i++) {
double area = OpencvUtil.area(cardContours.get(i));
if (area < size) {
opencv_imgproc.drawContours(mat, cardContours, i, new opencv_core.Scalar(0, 0));
}
}
return mat;
}
/**
* 人脸识别
*
* @param mat
* @return
*/
public static RectVector face(Mat mat) throws Exception {
File file = org.springframework.util.ResourceUtils
.getFile("classpath:idcard\\haarcascades\\haarcascade_frontalface_alt.xml");
CascadeClassifier faceDetector = new CascadeClassifier(file.getAbsolutePath());
// 在图片中检测人脸
RectVector faceDetections = new RectVector();
// 指定人脸识别的最大和最小像素范围
Size minSize = new Size(100, 100);
Size maxSize = new Size(500, 500);
// 参数设置为scaleFactor=1.1f, minNeighbors=4, flags=0 以此来增加识别人脸的正确率
faceDetector.detectMultiScale(mat, faceDetections, 1.1f, 4, 0, minSize, maxSize);
if (faceDetections != null && faceDetections.size() > 0L) {
// 在每一个识别出来的人脸周�
没有合适的资源?快使用搜索试试~ 我知道了~
java身份证号码识别,适用于web端身份证识别服务器,前端进行身份证号码定位,后端精准处理识别
共1290个文件
js:1091个
gif:76个
java:28个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 28 浏览量
2023-08-12
11:12:07
上传
评论
收藏 121.6MB ZIP 举报
温馨提示
java身份证号码识别,适用于web端身份证识别服务器,前端进行身份证号码定位,后端精准处理识别,准确率在96左右,对于自治区的身份证前面有其他文字的一样可以识别
资源推荐
资源详情
资源评论
收起资源包目录
java身份证号码识别,适用于web端身份证识别服务器,前端进行身份证号码定位,后端精准处理识别 (1290个子文件)
api_config 26B
mui.css 95KB
mui.min.css 74KB
layui.css 73KB
layer.css 14KB
layui.mobile.css 10KB
laydate.css 7KB
custom2.css 7KB
cropper.css 5KB
iconfont.css 3KB
mui.indexedlist.css 2KB
code.css 1KB
custom.css 565B
webuploader.css 515B
digits 36B
Dockerfile 405B
iconfont.eot 46KB
iconfont.eot 2KB
vc_redist.x64.exe 14.38MB
59.gif 10KB
22.gif 10KB
24.gif 8KB
13.gif 7KB
16.gif 7KB
39.gif 6KB
64.gif 6KB
63.gif 6KB
50.gif 6KB
loading-0.gif 6KB
4.gif 6KB
1.gif 5KB
42.gif 5KB
71.gif 5KB
21.gif 5KB
20.gif 5KB
29.gif 5KB
70.gif 4KB
5.gif 4KB
17.gif 4KB
27.gif 4KB
9.gif 4KB
44.gif 4KB
11.gif 4KB
8.gif 4KB
3.gif 4KB
23.gif 4KB
34.gif 4KB
41.gif 4KB
38.gif 4KB
65.gif 3KB
32.gif 3KB
45.gif 3KB
7.gif 3KB
12.gif 3KB
26.gif 3KB
60.gif 3KB
2.gif 3KB
40.gif 3KB
25.gif 3KB
19.gif 3KB
66.gif 3KB
18.gif 3KB
46.gif 3KB
10.gif 3KB
28.gif 3KB
51.gif 3KB
57.gif 3KB
67.gif 3KB
0.gif 3KB
48.gif 3KB
43.gif 3KB
30.gif 2KB
61.gif 2KB
33.gif 2KB
69.gif 2KB
14.gif 2KB
47.gif 2KB
36.gif 2KB
49.gif 2KB
58.gif 2KB
6.gif 2KB
54.gif 2KB
53.gif 2KB
56.gif 2KB
62.gif 2KB
31.gif 2KB
55.gif 2KB
35.gif 2KB
15.gif 2KB
loading-2.gif 2KB
37.gif 1KB
68.gif 1KB
52.gif 777B
loading-1.gif 701B
60x60.gif 203B
.gitignore 168B
hocr 22B
idcard2.html 11KB
idcard.html 10KB
idcard_bak.html 7KB
共 1290 条
- 1
- 2
- 3
- 4
- 5
- 6
- 13
资源评论
Java程序员-张凯
- 粉丝: 1w+
- 资源: 6735
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 《班级管理相关类的实现+射击游戏类的实现(Python)》学生实验(项目)报告
- MSI2301-VB一款SOT23封装P-Channel场效应MOS管
- sap-me-complex- assembly-how-to-guide-en
- sap-me-collaboration-how-to-guide-en
- 达梦数据库-备份与还原-国产数据库-DM8备份与还原.pdf
- MP4946-VB一款SOP8封装2个N-Channel场效应MOS管
- sap-me-basic-routing-how-to-guide-en
- 《图书管理系统(Python)》学生实验(项目)报告
- How To Set Up and Use the SAP ME Barcode Scanning Feature
- LMX2594 硬件参考设计
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功