欢迎来到淼淼之森的个人小站。  交流请加我微信好友: studyjava。  也欢迎关注同名公众号:Java学习之道

JavaCV开发详解之5:基于 JavaCV 的人脸识别

  |   0 评论   |   0 浏览

引入依赖

<!-- https://mvnrepository.com/artifact/org.bytedeco/javacv -->
        <dependency>
            <groupId>org.bytedeco</groupId>
            <artifactId>javacv</artifactId>
            <version>1.5.3</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.bytedeco/javacv-platform -->
        <dependency>
            <groupId>org.bytedeco</groupId>
            <artifactId>javacv-platform</artifactId>
            <version>1.5.3</version>
        </dependency>

引入人脸识别特征文件

下载如下文件,解压后放在项目中和 src 同级的 lib 文件夹下(如没有 lib 文件夹,创建一个即可)

haarcascades.zip

代码实现

package com.java.puwang.opencv;
 
import org.bytedeco.javacv.CanvasFrame;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.OpenCVFrameGrabber;
import org.bytedeco.opencv.opencv_core.*;
import org.bytedeco.opencv.opencv_objdetect.*;
 
import javax.swing.*;
 
import static org.bytedeco.opencv.global.opencv_imgproc.*;
 
/**
 * @author :created by mmzsblog.cn
 * @description:基于 JavaCV 的人脸识别
 * @date :created at 2020/08/07 16:02
 */
public class FaceCheck {
    /**
     * 人脸检测
     * @param cascadeClassifierXml 基于Haar特征的cascade正面人脸分类器
     * @param width 图像宽度
     * @param height 图像高度
     */
    public static void faceDetection(String cascadeClassifierXml,Integer width,Integer height) throws Exception, InterruptedException {
        // 开启摄像头,获取图像(得到的图像为frame类型,需要转换为mat类型进行检测和识别)
        OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);
        if(width!=null&&width>1&&height!=null&&height>1) {
            grabber.setImageWidth(width);
            grabber.setImageHeight(height);
        }
        grabber.start();
 
        if(width==null||height==null) {
            height=grabber.getImageHeight();
            width=grabber.getImageWidth();
        }
 
        CanvasFrame canvas = new CanvasFrame("人脸检测");// 新建一个预览窗口
        canvas.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        canvas.setVisible(true);
        canvas.setFocusable(true);
        //窗口置顶
        if(canvas.isAlwaysOnTopSupported()) {
            canvas.setAlwaysOnTop(true);
        }
        Frame frame =null;
 
        // 读取opencv人脸检测器
        CascadeClassifier cascade = new CascadeClassifier(cascadeClassifierXml);
 
        for(;canvas.isVisible()&&(frame=grabber.grab())!=null;) {
 
            Mat img = (Mat) frame.opaque;// 从frame中直接获取Mat
 
            Mat grayImg = new Mat();//存放灰度图
            //摄像头色彩模式设置成ImageMode.Gray下不需要再做灰度
            cvtColor(img, grayImg, COLOR_BGRA2GRAY);// 摄像头获取的是彩色图像,所以先灰度化下
            //如果要获取摄像头灰度图,可以直接对FrameGrabber进行设置grabber.setImageMode(ImageMode.GRAY);,grabber.grab()获取的都是灰度图
 
            equalizeHist(grayImg, grayImg);// 均衡化直方图
 
            // 检测到的人脸
            RectVector faces = new RectVector();
            cascade.detectMultiScale(grayImg, faces);
 
            // 遍历人脸
            for (int i = 0; i < faces.size(); i++) {
                Rect face_i = faces.get(i);
                //绘制人脸矩形区域,scalar色彩顺序:BGR(蓝绿红)
                rectangle(img, face_i, new Scalar(0, 255, 0, 1));
 
                int pos_x = Math.max(face_i.tl().x() - 10, 0);
                int pos_y = Math.max(face_i.tl().y() - 10, 0);
                // 在人脸矩形上方绘制提示文字
                putText(img, "people face", new Point(pos_x, pos_y), FONT_HERSHEY_COMPLEX, 1.0,new Scalar(0, 0, 255, 2.0));
            }
 
            canvas.showImage(frame);// 获取摄像头图像并放到窗口上显示,frame是一帧视频图像
            Thread.sleep(40);// 40毫秒刷新一次图像
        }
        cascade.close();
        canvas.dispose();
        grabber.close();// 停止抓取
    }
 
    public static void main(String[] args) throws Exception, InterruptedException {
        faceDetection(System.getProperty("user.dir")+"\\lib\\haarcascades\\haarcascade_frontalface_alt.xml",960,540);
    }
}

标题:JavaCV开发详解之5:基于 JavaCV 的人脸识别
作者:mmzsblog
地址:https://www.mmzsblog.cn/articles/2020/09/13/1600003345901.html

如未加特殊说明,文章均为原创,转载必须注明出处。均采用CC BY-SA 4.0 协议

本网站发布的内容(图片、视频和文字)以原创、转载和分享网络内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。若本站转载文章遗漏了原文链接,请及时告知,我们将做删除处理!文章观点不代表本网站立场,如需处理请联系首页客服。
• 网站转载须在文章起始位置标注作者及原文连接,否则保留追究法律责任的权利。
• 公众号转载请联系网站首页的微信号申请白名单!

个人微信公众号 ↓↓↓                 

微信搜一搜 Java 学习之道