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实现人脸识别/人眼检测/图片截取/合成/添加水印

利用OpenCV的人脸检测给头像带上圣诞帽

Atitti opencv2.4 实现的人脸检测 attilax总结

教你用OpenCV人脸检测自动给头像戴圣诞帽(附代码)

请教,jni调用,类型转换.用opencv进行静态人脸检测