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;
}