当前位置:   article > 正文

java集成opencv(不踩坑),实现人脸检测小demo(含上传人像图片识别接口),windows,IDEA,Springboot_java opencv

java opencv

目录

1.正常用maven导入坐标:

2.下载库文件:

3.下载模型文件:

4.把库文件粘贴到你的jdk的bin目录下

5.把模型文件放到你的项目目录

6.编写你的javase测试代码

7.编写前端提交人脸图片的后端人脸校验接口

8惊喜:这时前端调用你的接口就会:

9.注意:该依赖目前不支持java自训练模型,自训练接口仅对c++语言提供,社区补充版本的依赖可以支持模型自训练


先一步一步来,中间会讲解会踩到的坑。

作者环境:java11(最好用java8)

1.正常用maven导入坐标:

  1. <dependency>
  2. <groupId>org.openpnp</groupId>
  3. <artifactId>opencv</artifactId>
  4. <version>4.5.3-1</version>
  5. </dependency>

依赖下载完别急着写代码

你急着把测试代码写了会遇到:

库文件找不到异常

2.下载库文件:

Releases - OpenCVicon-default.png?t=N7T8https://opencv.org/releases/

下载对应版本

下载好运行解压到指定目录后一路打开找到这个opencv_java453.dll

3.下载模型文件:

https://github.com/opencv/opencv/blob/master/data/haarcascades/haarcascade_frontalface_alt.xmlicon-default.png?t=N7T8https://github.com/opencv/opencv/blob/master/data/haarcascades/haarcascade_frontalface_alt.xml

这个是用于人脸识别的模型

4.把库文件粘贴到你的jdk的bin目录下

因为你在javase的测试main方法调用opencv的api,该api底层是会依赖opencv_java453.dll这个库的,jvm首先就在bin目录下查找该库,所以需要把库文件放bin下。

5.把模型文件放到你的项目目录

可以是根目录也可以像作者一样放src下:

6.编写你的javase测试代码

注意图片文件路径、模型文件路径,不要无脑copy过来直接运行,你只需要修改成你自己项目里面的路径就可以了

  1. import org.opencv.core.*;
  2. import org.opencv.imgcodecs.Imgcodecs;
  3. import org.opencv.imgproc.Imgproc;
  4. import org.opencv.objdetect.CascadeClassifier;
  5. import java.util.Arrays;
  6. import java.util.Base64;
  7. /**
  8. * @author mijiupro
  9. */
  10. public class FaceDetection {
  11. //人脸检测器
  12. private static final CascadeClassifier FACE_DETECTOR;
  13. //人脸模型xml文件路径
  14. private static final String FACE_MODEL_PATH = "src/main/java/com/mi9688/common/opencv/model/haarcascade_frontalface_alt.xml";
  15. //测试图片文件夹路径
  16. private static final String TRAINING_DATA_DIR = "src/main/java/com/mi9688/common/opencv/sample";
  17. //检测并处理后保存图片路径
  18. private static final String DETECTION_RESULT ="src/main/java/com/mi9688/common/opencv/result/result.jpg";
  19. static {
  20. System.loadLibrary(Core.NATIVE_LIBRARY_NAME);//加载库文件
  21. FACE_DETECTOR = new CascadeClassifier(FACE_MODEL_PATH);//创建级联分类器加载人脸模型xml文件
  22. }
  23. /**
  24. * 测试模型
  25. */
  26. public static void testModel() {
  27. // 加载样本图片
  28. Mat image = Imgcodecs.imread(TRAINING_DATA_DIR+"/1.jpg");
  29. // 检测人脸
  30. MatOfRect faceDetections = new MatOfRect();
  31. FACE_DETECTOR.detectMultiScale(image, faceDetections);
  32. int numFaces = faceDetections.toArray().length;
  33. System.out.println("人脸数量: " + numFaces);
  34. // 绘制标人脸识框并打印人脸位置坐标
  35. Arrays.stream(faceDetections.toArray()).forEach(
  36. (rect) -> {
  37. Imgproc.rectangle(image, new Point(rect.x, rect.y),
  38. new Point(rect.x + rect.width, rect.y + rect.height),
  39. new Scalar(0, 255, 0));
  40. System.out.println("坐标: (" + rect.x + ", " + rect.y + ")");
  41. });
  42. // 保存处理后的图片
  43. Imgcodecs.imwrite(DETECTION_RESULT, image);
  44. }
  45. public static void main(String[] args) {
  46. testModel();
  47. }
  48. }

运行后你会得到:

恭喜你完成了第一步,当你把人脸识别封装成接口时,又会遇到惊喜,下面说一下这个惊喜。

7.编写前端提交人脸图片的后端人脸校验接口

继续在该测试类写个人脸校验静态方法

  1. public static Boolean hasOneFace(String base64Image) {
  2. try {
  3. Mat imageMat = Imgcodecs.imdecode(new MatOfByte(Base64.getDecoder().decode(base64Image)), Imgcodecs.IMREAD_UNCHANGED);
  4. // 转换为灰度图像
  5. Mat grayImageMat = new Mat();
  6. Imgproc.cvtColor(imageMat, grayImageMat, Imgproc.COLOR_BGR2GRAY);
  7. // 检测人脸
  8. MatOfRect faceDetections = new MatOfRect();
  9. FACE_DETECTOR.detectMultiScale(grayImageMat, faceDetections, 1.1, 2, 0, new Size(30, 30));
  10. int numFaces = faceDetections.toArray().length;
  11. log.info("人脸数量: " + numFaces);
  12. if (numFaces != 1) {
  13. log.info("请确保人脸数量为1,且人脸位于图片正中央");
  14. return false;
  15. }
  16. Arrays.stream(faceDetections.toArray()).forEach(rect -> log.info("坐标: (" + rect.x + ", " + rect.y + ")"));
  17. } catch (Exception e) {
  18. log.info(e.getMessage());
  19. }
  20. return true;
  21. }

controller:

  1. @PostMapping("/staff-is-face1")
  2. public Result<?> isFaceByOpencv(@RequestBody String faceBase64) {
  3. if(FaceDetection.hasOneFace(faceBase64)){
  4. return Result.success();
  5. }
  6. return Result.error(ResultCode.FAIL);
  7. }

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坐标:

  1. <dependency>
  2. <groupId>org.bytedeco</groupId>
  3. <artifactId>javacv-platform</artifactId>
  4. <version>1.5.9</version>
  5. </dependency>

具体看github官方文档

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/686360
推荐阅读
相关标签
  

闽ICP备14008679号