【人脸检测】OpenCV调用深度学习模型实现人脸检测-java
介绍
这个Dome是利用OpenCV加载Tensorflow训练的模型,然后返回图片中人脸的位置信息,然后再显示出来
效果,大家可以参考这里7.46 复制打开抖音,看看【写的一手烂代码的作品】人脸检测 java也能用深度学习模型,识别率还挺高… https://v.douyin.com/iU8cUxj5/ zGi:/ 07/10 x@s.eb
说明
- 为了方便大家直接使用,我把代码封装到jar包中了,后期有时间我上传到maven仓库
- 想要了解原理的,可以直接反编译看jar代码,其实也没有几行,很简单
- 我写了2个列子,一个是图片,一个摄像头显示的视频,识别其实只有一行代码
FaceDetection.getInstance().action(imgPath);
步骤
jar包和备用的图片
jar下载地址:https://files.yixueai.cn/jar/face-detections-0.31.jar
识别图片的代码
import com.lancode.Face;
import com.lancode.FaceDetection;
import org.opencv.core.*;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import java.util.List;
public class Demo {
public static void main(String[] args) throws Exception {
// 随便找一个张带有人脸的图片
String imgPath = "E:\\age_gender.jpg";
// =================关键代码==============
List<Face> rets = FaceDetection.getInstance().action(imgPath);
// =================关键代码==============
Mat frame = Imgcodecs.imread(imgPath);
for (Face face : rets) {
System.out.println("左上角坐标信息 = (" + face.getX() +"," + face.getY() + ") 人脸的高度 = " + face.getHeight() + " 人脸的宽度 = " + face.getWidth() + " 有多少把握是正确的" + face.getScore());
// 下面是将信息在原图中画出来显示出来,实际不需要的代码
Rect rect = new Rect((int)face.getX(), (int)face.getY(), (int)face.getWidth(), (int)face.getHeight());
Imgproc.rectangle(frame, rect, new Scalar(0, 0, 255), 2 , 8);
Imgproc.putText(frame, String.format("%.2f", face.getScore()), new Point(rect.x, rect.y-5), Imgproc.FONT_HERSHEY_COMPLEX,1.0,new Scalar(255,0,0));
}
// 显示画好后的图片
HighGui.imshow("LanCode人脸检测演示", frame);
HighGui.waitKey(0);
}
}
代码效果
视频的代码
import com.lancode.Face;
import com.lancode.FaceDetection;
import org.opencv.core.*;
import org.opencv.highgui.HighGui;
import org.opencv.imgproc.Imgproc;
import org.opencv.videoio.VideoCapture;
import java.util.List;
public class CameraDisplay {
public static void main(String[] args) throws Exception {
// 获取FaceDetection类
FaceDetection instance = FaceDetection.getInstance();
// 打开默认摄像头
VideoCapture camera = new VideoCapture(0);
// 检查摄像头是否成功打开
if (!camera.isOpened()) {
System.out.println("无法打开摄像头");
return;
}
// 创建一个窗口
HighGui.namedWindow("摄像头", HighGui.WINDOW_AUTOSIZE);
// 定义一个Mat对象来存储帧
Mat frame = new Mat();
// 循环读取摄像头帧
while (true) {
// 读取新一帧
camera.read(frame);
// ======关键代码==========
List<Face> faces = instance.action(frame);
// ======关键代码==========
// 下面和图片是一样的
for (Face face : faces) {
Rect rect = new Rect((int)face.getX(), (int)face.getY(), (int)face.getWidth(), (int)face.getHeight());
Imgproc.rectangle(frame, rect, new Scalar(0, 0, 255), 2 , 8);
Imgproc.putText(frame, String.format("%.2f", face.getScore()), new Point(rect.x, rect.y-5), Imgproc.FONT_HERSHEY_COMPLEX,1.0,new Scalar(255,0,0));
}
// 如果读取帧成功,显示在窗口中
if (!frame.empty()) {
HighGui.imshow("摄像头", frame);
} else {
System.out.println("没有捕获到帧,退出...");
break;
}
// 按 'q' 键退出循环
if (org.opencv.highgui.HighGui.waitKey(1) == 'q') {
break;
}
}
// 释放摄像头资源
camera.release();
// 销毁所有窗口
org.opencv.highgui.HighGui.destroyAllWindows();
}
}
原文地址:https://blog.csdn.net/yuanyuneixin1/article/details/144412911
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!