? ? 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,运行程序报错,后来把这个文件提出来,放到项目路径下,运行不报错。
? ? ?有的文章说,这个训练模型文件的路径?不能带中文,我这里是路径太长。另外,我下载的模型文件好像不全,也报过这个错误。大家在编码的时候注意一下。
|