JavaCV的摄像头实战之八:人脸检测,5年经验Java程序员面试27天

  • @param frame

  • @return

*/

Frame convert(Frame frame);

/**

  • 释放资源

*/

void releaseOutputResource();

  • 另外还有两个静态方法,也放在DetectService.java中,第一个是buildGrayImage,该方法会根据入参Mat的尺寸新建一个Mat对象,新建的对象用于保存灰度图片,因为检测时用的是灰度图片而不是原图:

/**

  • 根据传入的MAT构造相同尺寸的MAT,存放灰度图片用于以后的检测

  • @param src 原始图片的MAT对象

  • @return 相同尺寸的灰度图片的MAT对象

*/

static Mat buildGrayImage(Mat src) {

return new Mat(src.rows(), src.cols(), CV_8UC1);

}

  • 第二个方法是第一个是detect,该方法非常重要:将原图转为灰度图片,再用指定的分类器检测,将检测结果在原图上标注出来,标注后的Mat转为Frame对象返回:

/**

  • 检测图片,将检测结果用矩形标注在原始图片上

  • @param classifier 分类器

  • @param converter Frame和mat的转换器

  • @param rawFrame 原始视频帧

  • @param grabbedImage 原始视频帧对应的mat

  • @param grayImage 存放灰度图片的mat

  • @return 标注了检测结果的视频帧

*/

static Frame detect(CascadeClassifier classifier,

OpenCVFrameConverter.ToMat converter,

Frame rawFrame,

Mat grabbedImage,

Mat grayImage) {

// 当前图片转为灰度图片

cvtColor(grabbedImage, grayImage, CV_BGR2GRAY);

// 存放检测结果的容器

RectVector objects = new RectVector();

// 开始检测

classifier.detectMultiScale(grayImage, objects);

// 检测结果总数

long total = objects.size();

// 如果没有检测到结果,就用原始帧返回

if (total<1) {

return rawFrame;

}

// 如果有检测结果,就根据结果的数据构造矩形框,画在原图上

for (long i = 0; i < total; i++) {

Rect r = objects.get(i);

int x = r.x(), y = r.y(), w = r.width(), h = r.height();

rectangle(grabbedImage, new Point(x, y), new Point(x + w, y + h), Scalar.RED, 1, CV_AA, 0);

}

// 释放检测结果资源

objects.close();

// 将标注过的图片转为帧,返回

return converter.convert(grabbedImage);

}

  • 以上就是接口DetectService.java的全部:三个方法定义,两个静态方法,接下来就是接口的实现类了

人脸检测功能的实现类

  • 前面的DetectService接口仅定义了三个方法:初始化(init)、检测(convert)、资源释放(releaseOutputResource),现在开发这个接口的实现类HaarCascadeDetectService.java,实现真正的人脸检测功能

  • 完整代码如下,核心是init方法中实例化的分类器classifier,以及负责处理每一帧的convert方法,这里面会中调用刚才写的静态方法DetectService.detect,把原始帧转换成标注了检测结果的帧:

package com.bolingcavalry.grabpush.extend;

import lombok.extern.slf4j.Slf4j;

import org.bytedeco.javacpp.Loader;

import org.bytedeco.javacv.Frame;

import org.bytedeco.javacv.OpenCVFrameConverter;

import org.bytedeco.opencv.opencv_core.Mat;

import org.bytedeco.opencv.opencv_objdetect.CascadeClassifier;

import java.io.File;

import java.net.URL;

/**

  • @author willzhao

  • @version 1.0

  • @description Haar检测的实现类

  • @date 2021/12/3 8:09

*/

@Slf4j

public class HaarCascadeDetectService implements DetectService {

/**

  • 每一帧原始图片的对象

*/

private Mat grabbedImage = null;

/**

  • 原始图片对应的灰度图片对象

*/

private Mat grayImage = null;

/**

  • 分类器

*/

private CascadeClassifier classifier;

/**

  • 转换器

*/

private OpenCVFrameConverter.ToMat converter = new OpenCVFrameConverter.ToMat();

/**

  • 模型文件的下载地址

*/

private String modelFileUrl;

/**

  • 构造方法,在此指定模型文件的下载地址

  • @param modelFileUrl

*/

public HaarCascadeDetectService(String modelFileUrl) {

this.modelFileUrl = modelFileUrl;

}

/**

  • 音频采样对象的初始化

  • @throws Exception

*/

@Override

public void init() throws Exception {

// 下载模型文件

URL url = new URL(modelFileUrl);

File file = Loader.cacheResource(url);

// 模型文件下载后的完整地址

String classifierName = file.getAbsolutePath();

// 根据模型文件实例化分类器

classifier = new CascadeClassifier(classifierName);

if (classifier == null) {

log.error(“Error loading classifier file [{}]”, classifierName);

System.exit(1);

}

}

@Override

public Frame convert(Frame frame) {

// 由帧转为Mat

grabbedImage = converter.convert(frame);

// 灰度Mat,用于检测

if (null==grayImage) {

grayImage = DetectService.buildGrayImage(grabbedImage);

}

// 进行人脸检测,根据结果做处理得到预览窗口显示的帧

return DetectService.detect(classifier, converter, frame, grabbedImage, grayImage);

}

/**

  • 程序结束前,释放人脸检测的资源

*/

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
img

总结

总体来说,如果你想转行从事程序员的工作,Java开发一定可以作为你的第一选择。但是不管你选择什么编程语言,提升自己的硬件实力才是拿高薪的唯一手段。

如果你以这份学习路线来学习,你会有一个比较系统化的知识网络,也不至于把知识学习得很零散。我个人是完全不建议刚开始就看《Java编程思想》、《Java核心技术》这些书籍,看完你肯定会放弃学习。建议可以看一些视频来学习,当自己能上手再买这些书看又是非常有收获的事了。

厂面经、学习笔记、源码讲义、实战项目、讲解视频**

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
[外链图片转存中…(img-i9k0CPJ3-1711137872652)]

总结

总体来说,如果你想转行从事程序员的工作,Java开发一定可以作为你的第一选择。但是不管你选择什么编程语言,提升自己的硬件实力才是拿高薪的唯一手段。

如果你以这份学习路线来学习,你会有一个比较系统化的知识网络,也不至于把知识学习得很零散。我个人是完全不建议刚开始就看《Java编程思想》、《Java核心技术》这些书籍,看完你肯定会放弃学习。建议可以看一些视频来学习,当自己能上手再买这些书看又是非常有收获的事了。

[外链图片转存中…(img-p5NsGw6i-1711137872653)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值