Java调用opencv库需要先去官网下载jar包和人脸识别的xml文件模型
opencv官网https://opencv.org/releases/
在官网下载两个文件,图片我标注的
source里面是官方的xml文件,包含人脸识别
windows下载下来是一个exe文件,里面包含项目需要的jar包
在官网上下载并解压出来,点击exe文件进行安装,根据自己的需求安装的所需目录,后续能找到即可
安装后就是这样,点击build进入
找到Java,点击进入
找到jar包和x64文件夹,x64文件有一个dll文件,复制下来
接下来打开idea
右键Java工程,创建一个lib目录,将刚才的jar包和x64文件夹下的dll文件复制到lib目录中,
选中lib目录右键,点击add as library目录,将lib中的jar包添加到Java依赖中
下面我们开始代码环节
人脸识别分为图片检测和调用摄像头检测,至于视频检测和图片检测差不多,所以我没有写
首先来看图片检测
package cv;
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;
public class FaceDetection {
static {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
}
public static void main(String[] args) {
// 加载OpenCV的XML分类器文件,用于人脸检测
//String xmlFile = "data\\haarcascades\\haarcascade_frontalface_alt.xml";
String xmlFile = "D:\\shoftwares\\opencv\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_alt.xml";
// 创建级联分类器对象并加载预训练的模型
CascadeClassifier faceDetector = new CascadeClassifier(xmlFile);
// 读取图像
Mat image = Imgcodecs.imread("./static/path_to_image.jpg");
// 检测图像中的物体(在这里是人脸)
MatOfRect faceDetections = new MatOfRect();
faceDetector.detectMultiScale(image, faceDetections);
// 在检测到的每个物体周围绘制矩形框 人脸区域
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));
}
//保存处理后的图像
Imgcodecs.imwrite("output_image.jpg", image);
// 显示结果图像
// 注意:这里假设你有一个显示图像的方法,如showImage
//showImage(image);
// 释放资源
//faceDetector.clo .release();
}
}
这个代码首先调用opencv的本地库
在main方法中,我们首先加载了opencv的xml文件用于人脸检测,调用mat对象中的imread方法读取一张图像,调用opencvJava库中的方法进行检测,绘制检测框,最后输出保存的图片到指定路径
下面是摄像头检测
package cv;
import org.opencv.core.*;
import org.opencv.highgui.HighGui;
import org.opencv.imgproc.Imgproc;
import org.opencv.objdetect.CascadeClassifier;
import org.opencv.videoio.VideoCapture;
import org.opencv.videoio.Videoio;
import static org.opencv.highgui.HighGui.*;
public class FaceDetectionVideo {
static {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
}
public static void main(String[] args) {
// 加载OpenCV的XML分类器文件,用于人脸检测
String xmlFile = "D:\\shoftwares\\opencv\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_alt.xml";
// 创建级联分类器对象并加载预训练的模型
CascadeClassifier faceDetector = new CascadeClassifier(xmlFile);
// 打开视频文件
VideoCapture capture = new VideoCapture(0);
// 检查摄像头是否成功打开
if (!capture.isOpened()) {
System.out.println("摄像头打不开!");
return;
}
// 创建窗口用于显示实时视频流
String windowName = "人脸检测";
HighGui.namedWindow(windowName, HighGui.WINDOW_NORMAL);
// 读取实时视频流的每一帧,并进行人脸检测
Mat frame = new Mat();
while (true) {
// 从摄像头捕获一帧图像
capture.read(frame);
// 检测图像中的物体(在这里是人脸)
MatOfRect faceDetections = new MatOfRect();
faceDetector.detectMultiScale(frame, faceDetections);
// 在检测到的每个物体周围绘制矩形框(即人脸区域)
for (Rect rect : faceDetections.toArray()) {
Imgproc.rectangle(frame, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height), new Scalar(0, 255, 0));
}
// 在窗口中显示实时视频流
HighGui.imshow(windowName, frame);
// 检查用户是否按下了 ESC 键
if (HighGui.waitKey(1) == 27) {
break;
}
}
// 释放资源
capture.release();
HighGui.destroyAllWindows();
}
}
摄像头检测其实也差不多,主要讲一下如何调用摄像头,调用opencvJava库中的VideoCapture对象的方法,参数为0说明调用本地摄像头,由于opencv没有提供窗口类,我们使用HighGui组件绘制窗口,使用while循环无限循环进行检测,绘制矩阵框。