本帖主要阐述如何利用JavaCV通过笔记本摄像头进行人脸检测,并将检测结果存储为本地图片
本机环境
macos10.13.2
jdk:1.8.0_131
eclipse:Oxygen.2 Release (4.7.2)
对应jar以及xml文件下载地址:链接: https://pan.baidu.com/s/1bVDn98fTHSmdFHgAf0mA_w 密码: s8yg
步骤-1:新建java项目-2:引入jar-3:复制代码-粘贴-4:运行
详细代码如下
package com.moonstudio;
import javax.swing.JFrame;
import org.bytedeco.javacpp.opencv_core.Mat;
import org.bytedeco.javacpp.opencv_core.Rect;
import org.bytedeco.javacpp.opencv_core.RectVector;
import org.bytedeco.javacv.CanvasFrame;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.FrameGrabber;
import org.bytedeco.javacv.OpenCVFrameConverter;
import org.bytedeco.javacv.OpenCVFrameGrabber;
import static org.bytedeco.javacpp.opencv_imgproc.*;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.bytedeco.javacpp.opencv_core.Scalar;
import org.bytedeco.javacpp.opencv_imgcodecs;
import org.bytedeco.javacpp.opencv_objdetect.CascadeClassifier;
public class Demo1 {
private static CascadeClassifier cascade;
public static void main(String[] args) throws Exception, InterruptedException {
try {
OpenCVFrameGrabber openCVFrameGrabber = new OpenCVFrameGrabber(0);
openCVFrameGrabber.start();
// 获取摄像头数据
CanvasFrame canvasFrame = new CanvasFrame("保持微笑");
canvasFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 新建一个窗口
canvasFrame.setAlwaysOnTop(true);
while (true) {
Frame frame = openCVFrameGrabber.grab();// 获取摄像头图像的一帧
OpenCVFrameConverter.ToIplImage converter = new OpenCVFrameConverter.ToIplImage();
Mat scr = converter.convertToMat(frame);// 将获取的frame转化成mat数据类型
detectFace(scr);// 人脸检测
frame = converter.convert(scr);// 将检测结果重新的mat重新转化为frame
canvasFrame.showImage(frame);// 获取摄像头图像并放到窗口上显示,frame是一帧视频图像
Thread.sleep(500);// 500毫秒刷新一次图像
if (!canvasFrame.isDisplayable()) {
// 如果关闭窗口,则关闭摄像头
openCVFrameGrabber.stop();
// 退出
System.exit(0);
}
System.gc();
}
} catch (FrameGrabber.Exception e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static Mat detectFace(Mat src) {
Mat grayscr = new Mat();
cvtColor(src, grayscr, COLOR_BGRA2GRAY);// 摄像头是彩色图像,所以先灰度化下
equalizeHist(grayscr, grayscr); // 创建用来装检测出来的人脸的容器
RectVector faces = new RectVector();
// 备用lbpcascade_frontalface.xml
cascade = new CascadeClassifier("haarcascade_frontalface_alt2.xml");
cascade.detectMultiScale(grayscr, faces);// 检测人脸,grayscr为要检测的图片,faces用来存放检测结果
if (faces.size() > 0) {
opencv_imgcodecs.imwrite("face.jpg", src);
for (int i = 0; i < faces.size(); i++) {
Rect face_i = faces.get(i);
rectangle(src, face_i, new Scalar(0, 0, 255, 2));
}
} else {
System.out.println("未检测到人脸!");
}
return src;
}
}
显示效果图