opencv for java实现人脸检测
Posted luffy5459
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opencv for java实现人脸检测相关的知识,希望对你有一定的参考价值。
opencv是一个很优秀的图像处理框架,可以通过源码编译,让他支持java开发,这里如果在windows下开发,可以直接使用opencv-453.jar和opencv_java452.dll动态库就够了。
下面给出一个简单的代码,实现人脸检测,所谓人脸检测,就是从一个图片或者视频里面找到人脸,一般我们测试,会直接把检测到的人脸轮廓标识出来,这样就表示我们检测成功了。
代码需要使用机器学习训练好的人脸模型数据haarcasecade_frontalface_alt.xml,这个文件在很多地方都可以下载。
don't talk, show me the code:
import org.opencv.core.*;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import org.opencv.objdetect.CascadeClassifier;
import java.net.URL;
public class FaceDetectDemo
public static void main(String[] args)
URL url = null;
String os = System.getProperty("os.name");
if(os.startsWith("Linux"))
url = ClassLoader.getSystemResource("opencvlib/libopencv_java452.so");
else
url = ClassLoader.getSystemResource("opencvlib/opencv_java452.dll");
System.load(url.getPath());
String path = "D:/java/workspaces/qrcodedemo/haarcascade_frontalface_alt.xml";
String imgPath = "C:/Users/86159/Pictures/face.jpg";
CascadeClassifier faceDetector = new CascadeClassifier(path);
Mat image = Imgcodecs.imread(imgPath);
MatOfRect faceDetections = new MatOfRect();
faceDetector.detectMultiScale(image,faceDetections);
System.out.println(String.format("Detected %s faces",faceDetections.toArray().length));
for(Rect rect:faceDetections.toArray())
Imgproc.rectangle(image,new Point(rect.x,rect.y),new Point(rect.x+rect.width,rect.y+rect.height),new Scalar(0,255,0));
String out = "output.png";
System.out.println(String.format("Writing %s",out));
boolean flag = Imgcodecs.imwrite(out,image);
System.out.println("done->"+flag);
运行代码,会加载face.jpg,然后根据人脸检测的结果,生成一个新的图片,图片中会使用矩形表示出人脸的轮廓。
原图face.jpg:
output.png
这里使用的是绿色1px的线条,可能看的不是很清晰,但是仔细看,图片中的人脸的确是被标识出来了。
这里给出的代码,没有详细说明opencv-453.jar怎么引入工程的,以及opencv_java453.dll怎么放到工程里面。 其实jar只需要加入开发工具classpath,dll文件放到合适的位置,程序能够像读文件一样读取到就可以了。
在开发中,遇到这样的问题:
/D:/java/workspaces/qrcodedemo/target/classes/haarcascade_frontalface_alt.xml
Exception in thread "main" CvException [org.opencv.core.CvException: cv::Exception: OpenCV(4.5.2) C:\\Users\\hlw\\Desktop\\opencv\\opencv\\modules\\objdetect\\src\\cascadedetect.cpp:1689: error: (-215:Assertion failed) !empty() in function 'cv::CascadeClassifier::detectMultiScale'
]
at org.opencv.objdetect.CascadeClassifier.detectMultiScale_5(Native Method)
at org.opencv.objdetect.CascadeClassifier.detectMultiScale(CascadeClassifier.java:255)
at FaceDetectDemo.main(FaceDetectDemo.java:23)
我的项目路径可能比较长,然后把训练模型文件haarcascade_frontalface_alt.xml放在资源文件路径下,最后加载的路径就成了:/D:/java/workspaces/qrcodedemo/target/classes/haarcascade_frontalface_alt.xml,运行程序报错,后来把这个文件提出来,放到项目路径下,运行不报错。
有的文章说,这个训练模型文件的路径 不能带中文,我这里是路径太长。另外,我下载的模型文件好像不全,也报过这个错误。大家在编码的时候注意一下。
以上是关于opencv for java实现人脸检测的主要内容,如果未能解决你的问题,请参考以下文章
#yyds干货盘点#Python图像处理,cv2模块,OpenCV实现人脸检测
Java使用OpenCV实现人脸识别/人眼检测/图片截取/合成/添加水印