javacv调用本地摄像头进行人脸检测

笔者由于最近一直搞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毫秒刷新一次图像

        }


    }


}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值