Java做人脸识别就是这么简单,看看猪厂是怎么做的

2019-06-07 16:07发布

考拉一次性能压测需求,需要准备大量的带有人脸的图片,找了nos的人提供了一批图片的URL链接,但是里面不一定包含人脸,而且没有规律可循,那么怎么办,总不能人工一张张筛选吧,累死不说,效率太低,根本无法满足项目需求。 以上为背景

这个时候从网上查找人脸识别的相关知识,基本上都是基于OpenCV来实现的,但是实现的语言就比较多了,像Python、Java等,本人对Java相对更熟悉一点,选择了Java。

环境搭建

1.首先下载核心库 OpenCV2.4.6,下载的时候,选择windows版的。然后安装

附 下载地址:https://opencv.org/releases.html ,自行下载需要的版本,不过246版本比较老,现在官网上面不提供此版本下载,

给大家一个 网盘地址 https://pan.baidu.com/s/1dFnlxjN 密码: 1wcs

2.其实安装的过程就是解压的过程,并没有什么安装向导之类的,安装完成后,我们最关心的是这个目录:opencv\build\java

注意:opencv-246.jar是需要在opencv的java类库,但是,真正的实现是opencv_java246.dll(X86和X64之分,关键看你的计算机是多少位的)

3.eclipse安装、Java安装、建工程就不讲了,自行百度

4.引入jar包和本地库

环境搭建结束

识别一张图片

1.编写DetectFaceDemo.java,代码如下:

  1. package com.netease.openCV246;
  2. import org.opencv.core.Core;
  3. import org.opencv.core.Mat;
  4. import org.opencv.core.MatOfRect;
  5. import org.opencv.core.Point;
  6. import org.opencv.core.Rect;
  7. import org.opencv.core.Scalar;
  8. import org.opencv.highgui.Highgui;
  9. import org.opencv.objdetect.CascadeClassifier;
  10. //
  11. // Detects faces in an image, draws boxes around them, and writes the results
  12. // to "faceDetection.png".
  13. //
  14. public class DetectFaceDemo {
  15. public void run() {
  16. System.out.println("\nRunning DetectFaceDemo");
  17. System.out.println(getClass().getResource("lbpcascade_frontalface.rar.xml").getPath());
  18. // Create a face detector from the cascade file in the resources
  19. // directory.
  20. //CascadeClassifier faceDetector = new CascadeClassifier(getClass().getResource("lbpcascade_frontalface.xml").getPath());
  21. //Mat image = Highgui.imread(getClass().getResource("lena.png").getPath());
  22. //注意:源程序的路径会多打印一个‘/’,因此总是出现如下错误
  23. /*
  24. * Detected 0 faces Writing faceDetection.png libpng warning: Image
  25. * width is zero in IHDR libpng warning: Image height is zero in IHDR
  26. * libpng error: Invalid IHDR data
  27. */
  28. //因此,我们将第一个字符去掉
  29. String xmlfilePath=getClass().getResource("lbpcascade_frontalface.xml").getPath().substring(1);
  30. CascadeClassifier faceDetector = new CascadeClassifier(xmlfilePath);
  31. Mat image = Highgui.imread(getClass().getResource("we.jpg").getPath().substring(1));
  32. // Detect faces in the image.
  33. // MatOfRect is a special container class for Rect.
  34. MatOfRect faceDetections = new MatOfRect();
  35. faceDetector.detectMultiScale(image, faceDetections);
  36. System.out.println(String.format("Detected %s faces", faceDetections.toArray().length));
  37. // Draw a bounding box around each face.
  38. for (Rect rect : faceDetections.toArray()) {
  39. Core.rectangle(image, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height), new Scalar(0, 255, 0));
  40. }
  41. // Save the visualized detection.
  42. String filename = "faceDetection.png";
  43. System.out.println(String.format("Writing %s", filename));
  44. Highgui.imwrite(filename, image);
  45. }
  46. }

2.编写测试类:

  1. package com.netease.openCV246;
  2. public class TestMain {
  3. public static void main(String[] args) {
  4. System.out.println("Hello, OpenCV");
  5. // Load the native library.
  6. System.loadLibrary("opencv_java246");
  7. new DetectFaceDemo().run();
  8. }
  9. }

运行后的结果

后面又试了几张,识别率还是挺高的,达到了90%以上。

本文来自网易实践者社区,作者张子铎授权。

文章来源: https://www.toutiao.com/group/6699282327157080579/