笔者由于最近一直搞java的人脸识别,由于JavaCV集成了opencv所以笔者这里采用 了JavaCV的方式
如下是笔者的pom文件
<!-- javacv start-->
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv-platform</artifactId>
<version>1.4.1</version>
</dependency>
<dependency>
<groupId>org.bytedeco.javacpp-presets</groupId>
<artifactId>opencv-platform</artifactId>
<version>3.4.1-1.4.1</version>
</dependency>
<!-- javacv end-->
代码如下:
package com.parenttest.testnginxffmpeg.utils;
import org.bytedeco.javacpp.opencv_core;
import org.bytedeco.javacpp.opencv_objdetect;
import org.bytedeco.javacv.*;
import javax.swing.*;
import static org.bytedeco.javacpp.opencv_imgproc.*;
public class opencvTest {
static opencv_objdetect.CascadeClassifier classifier=new opencv_objdetect.CascadeClassifier("E:\\springboot\\parent-test\\test-nginx-ffmpeg\\src\\main\\java\\com\\parenttest\\testnginxffmpeg\\config\\haarcascade_frontalface_alt.xml");//加载分类器的配置文件
public static opencv_core.Mat detectFace(opencv_core.Mat src)
{
opencv_core.Mat grayscr=new opencv_core.Mat();
cvtColor(src,grayscr,COLOR_BGRA2GRAY);//摄像头是彩色图像,所以先灰度化下
equalizeHist(grayscr,grayscr);//均衡化直方图
opencv_core.RectVector faces=new opencv_core.RectVector();
classifier.detectMultiScale(grayscr, faces);//用灰度Mat去识别得到人脸faces
for(int i=0;i<faces.size();i++)
{
opencv_core.Rect face_i=faces.get(i);
rectangle(src, face_i, new opencv_core.Scalar(0, 0, 255, 1));//对人脸的具体位置进行画框
}
return src;
}
public static void main(String[] args) throws FrameGrabber.Exception, InterruptedException {
OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0); //初始化摄像头,使用本地摄像头
System.out.println("开启摄像头!");
grabber.setImageWidth(640);
grabber.setImageHeight(480);
grabber.start(); //开始获取摄像头数据
System.out.println("摄像头已开启!");
CanvasFrame canvas = new CanvasFrame("人脸检测");//新建一个预览窗口
canvas.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置关闭窗口时销毁窗口
while(true){
if (!canvas.isEnabled()){
grabber.close();//停止抓取
System.exit(0);//退出
}
Frame frame=grabber.grab();//获取摄像头图像的一帧
/*获取摄像头图像并在窗口中显示,这里Frame frame=grabber.grab()得到是解码后的视频图像*/
OpenCVFrameConverter.ToMat convertor = new OpenCVFrameConverter.ToMat();//用于类型转换
System.out.println("正在进行转换!");
opencv_core.Mat scr=convertor.convertToMat(frame);//将获取的frame转化成mat数据类型
System.out.println("正在进行人脸检测!");
detectFace(scr);//人脸检测
frame=convertor.convert(scr);//将检测结果重新的mat重新转化为frame
canvas.showImage(frame);//获取摄像头图像并放到窗口上显示,frame是一帧视频图像
Thread.sleep(10);//10毫秒刷新一次图像
}
}
}