Java中基于OpenCV的人脸检测

1.下载并安装OpenCV

        根据你的运行平台选择OS和版本,我是windows-x64,因此下载:        https://sourceforge.net/projects/opencvlibrary/files/opencv-win/3.4.0/opencv-3.4.0-vc14_vc15.exe/download

        下载后,安装到文件夹中,会看到build和sources两大目录。

2.设置OpenCV的java本地库文件

        打开\build\java\x64,复制opencv_java340.dll文件到%JAVA_HOME%/bin目录下,因为本地库默认会从这里加载。

3.编写Java代码

        在Eclipse或IDEA创建java工程,添加对build\java\opencv-340.jar这个java包,并创建如下Java类开始运行人脸检测并输出。

package com.kuge;

import java.io.File;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfRect;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import org.opencv.objdetect.CascadeClassifier;

/**
 * OpenCV3.4 Java版人脸识别工具类。FaceDetect 
 * 【注意!!!】
 * 本项目的lib目录中的opencv_java340.dll是OpenCV编译后Windows平台的动态链接库文件,
 * 运行本代码前,应该把opencv_java340.dll文件放在%JAVA_HONE%/bin目录下
 * @author newton
 * @since 2019-06-12
 */
public class FaceDetect {

	static String classifierFile = "D:\\eclipse-teach\\dajiangtang\\opencv-java\\resources\\haarcascade_frontalface_default.xml";

	//main方法运行测试
	public static void main(String[] args) {
		boolean hasFace = detect("D:\\eclipse-teach\\dajiangtang\\opencv-java\\resources\\lena2.jpg", "d:\\ouput.jpg");
		if(hasFace){
			System.out.println("照片检测到人脸!");
		}
	}

	/**
	 * 识别指定图片上的所有人脸,并在识别的脸上画框标记出来,输出一张新图片。
	 * @param inImg 输入原图 *
	 * @param outImg 输出图片,在原图的基础上添加"识别框"
	 * @return true如果识别到有至少一个人脸;false如果没有识别到人脸
	 */
	public static boolean detect(String inImg, String outImg) {
		boolean hasHumanFace = false;
		File f = new File(inImg); // 原图片不存在直接退出
		if (!f.exists()) {
			System.out.println("\n Image File Not Found!");
			return hasHumanFace;
		}
		// 获取原文件路径,让输出文件与原文件保存在同一路径
		String filePath = f.getAbsolutePath().substring(0, f.getAbsolutePath().indexOf(File.separator) + 1);
		// 加载OPENCV3.4本地库,必须先加载
		System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
		System.out.println("\nRunning FaceDetector");
		CascadeClassifier faceDetector = new CascadeClassifier();
		/**
		 * * 分类器,路径根据实际情况调整 * haarcascade_frontalface_default 默认 *
		 * haarcascade_frontalface_alt 识别性能要好些
		 */
		boolean loadSuccess = faceDetector.load(classifierFile);
		if (loadSuccess) {
			System.out.println("加载分类器成功:" + loadSuccess);
			// 读取图像
			Mat image = Imgcodecs.imread(inImg);
			// 用于保存检测到的人脸
			MatOfRect faceDetections = new MatOfRect(); 
			// 开始检测人脸
			faceDetector.detectMultiScale(image, faceDetections);
			// 检测到的人脸矩形坐标
			Rect[] faces = faceDetections.toArray();
			// 是否识别到人脸,返回值
			hasHumanFace = faces.length > 0 ? true : false;
			System.out.println(String.format("Detected %s faces", faces.length));
			int i = 0;
			for (Rect rect : faces) {
				// 循环所有检测到的人脸
				Point x = new Point(rect.x, rect.y);
				Point y = new Point(rect.x + rect.width, rect.y + rect.height);
				// 在image图片上画框,x,y可确定框的位置和大小,new Scalar(0,255,0)是框的颜色,自行调整
				Imgproc.rectangle(image, x, y, new Scalar(0, 255, 0)); // 保存检测的人脸小图片
				Rect r = new Rect(x, y);
				System.out.println(r.height + ":" + r.width);
				Mat areaM = new Mat(image, r); // 保存检测的人脸小图片到tmp+序号的jpg文件
				String tmpFilePath = filePath + "tmp" + (i++) + ".jpg";
				Imgcodecs.imwrite(tmpFilePath, areaM);
			}
			// 保存画了方框的图片
			String filename = outImg;
			Imgcodecs.imwrite(filename, image);
			// 销毁
			image.release();
			
		}else{
			System.out.println("加载分类器失败!请检查文件路径是否正确。" );
		}
		return hasHumanFace;
	}

}

猜你喜欢

转载自blog.csdn.net/liudun_cool/article/details/91579482