目录
9.注意:该依赖目前不支持java自训练模型,自训练接口仅对c++语言提供,社区补充版本的依赖可以支持模型自训练
先一步一步来,中间会讲解会踩到的坑。
作者环境:java11(最好用java8)
1.正常用maven导入坐标:
<dependency>
<groupid>org.openpnp</groupid>
<artifactid>opencv</artifactid>
<version>4.5.3-1</version>
</dependency>
依赖下载完别急着写代码
你急着把测试代码写了会遇到:
库文件找不到异常
2.下载库文件:
releases - opencvhttps://opencv.org/releases/
下载对应版本
下载好运行解压到指定目录后一路打开找到这个opencv_java453.dll
3.下载模型文件:
这个是用于人脸识别的模型
4.把库文件粘贴到你的jdk的bin目录下
因为你在javase的测试main方法调用opencv的api,该api底层是会依赖opencv_java453.dll这个库的,jvm首先就在bin目录下查找该库,所以需要把库文件放bin下。
5.把模型文件放到你的项目目录
可以是根目录也可以像作者一样放src下:
6.编写你的javase测试代码
注意图片文件路径、模型文件路径,不要无脑copy过来直接运行,你只需要修改成你自己项目里面的路径就可以了
import org.opencv.core.*;
import org.opencv.imgcodecs.imgcodecs;
import org.opencv.imgproc.imgproc;
import org.opencv.objdetect.cascadeclassifier;
import java.util.arrays;
import java.util.base64;
/**
* @author mijiupro
*/
public class facedetection {
//人脸检测器
private static final cascadeclassifier face_detector;
//人脸模型xml文件路径
private static final string face_model_path = "src/main/java/com/mi9688/common/opencv/model/haarcascade_frontalface_alt.xml";
//测试图片文件夹路径
private static final string training_data_dir = "src/main/java/com/mi9688/common/opencv/sample";
//检测并处理后保存图片路径
private static final string detection_result ="src/main/java/com/mi9688/common/opencv/result/result.jpg";
static {
system.loadlibrary(core.native_library_name);//加载库文件
face_detector = new cascadeclassifier(face_model_path);//创建级联分类器加载人脸模型xml文件
}
/**
* 测试模型
*/
public static void testmodel() {
// 加载样本图片
mat image = imgcodecs.imread(training_data_dir+"/1.jpg");
// 检测人脸
matofrect facedetections = new matofrect();
face_detector.detectmultiscale(image, facedetections);
int numfaces = facedetections.toarray().length;
system.out.println("人脸数量: " + numfaces);
// 绘制标人脸识框并打印人脸位置坐标
arrays.stream(facedetections.toarray()).foreach(
(rect) -> {
imgproc.rectangle(image, new point(rect.x, rect.y),
new point(rect.x + rect.width, rect.y + rect.height),
new scalar(0, 255, 0));
system.out.println("坐标: (" + rect.x + ", " + rect.y + ")");
});
// 保存处理后的图片
imgcodecs.imwrite(detection_result, image);
}
public static void main(string[] args) {
testmodel();
}
}
运行后你会得到:
恭喜你完成了第一步,当你把人脸识别封装成接口时,又会遇到惊喜,下面说一下这个惊喜。
7.编写前端提交人脸图片的后端人脸校验接口
继续在该测试类写个人脸校验静态方法
public static boolean hasoneface(string base64image) {
try {
mat imagemat = imgcodecs.imdecode(new matofbyte(base64.getdecoder().decode(base64image)), imgcodecs.imread_unchanged);
// 转换为灰度图像
mat grayimagemat = new mat();
imgproc.cvtcolor(imagemat, grayimagemat, imgproc.color_bgr2gray);
// 检测人脸
matofrect facedetections = new matofrect();
face_detector.detectmultiscale(grayimagemat, facedetections, 1.1, 2, 0, new size(30, 30));
int numfaces = facedetections.toarray().length;
log.info("人脸数量: " + numfaces);
if (numfaces != 1) {
log.info("请确保人脸数量为1,且人脸位于图片正中央");
return false;
}
arrays.stream(facedetections.toarray()).foreach(rect -> log.info("坐标: (" + rect.x + ", " + rect.y + ")"));
} catch (exception e) {
log.info(e.getmessage());
}
return true;
}
controller:
@postmapping("/staff-is-face1")
public result<?> isfacebyopencv(@requestbody string facebase64) {
if(facedetection.hasoneface(facebase64)){
return result.success();
}
return result.error(resultcode.fail);
}
8惊喜:这时前端调用你的接口就会:
又出现库找不到异常了:
这时候你大概率引入了热部署依赖大部分都是这个原因:
这时你需要注释掉热部署导入,然后maven刷新依赖,重启就解决了。
如果还没有解决
那就在你的c:\windows\system32目录也复制一份库文件opencv_java453.dll
ok到这里你99%已经可以愉快使用你的opencv了
9.注意:该依赖目前不支持java自训练模型,自训练接口仅对c++语言提供,社区补充版本的依赖可以支持模型自训练
地址如下:https://github.com/opencv/opencv/blob/master/data/haarcascades/haarcascade_frontalface_alt.xml
maven坐标:
<dependency>
<groupid>org.bytedeco</groupid>
<artifactid>javacv-platform</artifactid>
<version>1.5.9</version>
</dependency>
具体看github官方文档
发表评论