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;
}
}