200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > JavaCV进阶opencv图像检测识别:摄像头图像人脸检测

JavaCV进阶opencv图像检测识别:摄像头图像人脸检测

时间:2018-09-13 14:14:56

相关推荐

JavaCV进阶opencv图像检测识别:摄像头图像人脸检测

JavaCV免费教程目录:

JavaCV入门教程(免费JavaCV教程)

javacv实战专栏目录(更新至今):

JavaCV实战专栏文章目录(更新至今)

最新JavaCV最新音视频教程目录:

JavaCV音视频教程目录(最新JavaCV教程)

javacv进阶opencv图像检测/识别系列

人脸检测识别

JavaCV进阶opencv图像处理:摄像头图像人脸检测

JavaCV进阶opencv图像处理:ffmpeg视频图像画面人脸检测

JavaCV进阶opencv图像处理:批量人脸图像分类训练

JavaCV进阶opencv图像处理:摄像头图像人脸识别

二维码识别

JavaCV进阶opencv图像处理:扫描并识别摄像头中的二维码

JavaCV进阶opencv图像处理:10行代码快速实现扫描识别图片中的二维码

JavaCV进阶opencv图像处理:扫描并识别视频中的二维码

前言

一点闲言碎语(建议跳过):

为什么博主之前一直没写人脸检测和识别?因为javacv官方首页的demo演示就是人脸检测,大家不必看博主再写一遍,所以博主一直没写。为什么最终又写了呢?这是因为最近看了不少网上写得javacv人脸检测demo,发现能正常运行的没几个。有一两篇能看的过去的,也多多少少有点问题,大部分文章连javacv的api都没搞清楚,所以本章对这些问题都会统一进行讲解。

OpenCVFrameGrabber中的Frame与Mat的关联

关于OpenCVFrameGrabber不需要使用FrameConverter去转换Frame和Mat的问题

可以参考博主JavaCV入门指南:调用FFmpeg原生API和JavaCV是如何封装了FFmpeg的音视频操作文章中关于Frame的结构分析:

只有使用非OpenCVFrameGrabber的抓取器才需要使用转换器进行转换,Frame里面的一个字段opaque引用了AVFrame、AVPacket、Mat等数据,所以可以直接从Frame中直接获得Mat,不需要再进行转换了。

FFmpegFrameGrabber读取图片、视频文件、视频流或者桌面屏幕画面进行人脸检测会在下一章放出。

功能实现

1、使用OpenCVFrameGrabber获取摄像头画面

2、使用opencv的Haar cascade正面人脸分类器进行人脸检测

Haar cascade分类检测库文件下载:haarcascade_frontalface_alt.xml-图像处理文档类资源-CSDN下载

补充:

OpencvFrameGrabber是可以支持普通视频文件和视频流的读取的,所以本章代码可以很方便的更改为读取视频文件或者视频流。

代码实现

在代码中需要导入一下opencv包

import static org.bytedeco.opencv.global.opencv_core.*;import static org.bytedeco.opencv.global.opencv_face.*;import static org.bytedeco.opencv.global.opencv_imgproc.*;import static org.bytedeco.opencv.global.opencv_objdetect.*;

/*** 人脸检测-eguid* @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中直接获取MatMat 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("haarcascade_frontalface_alt.xml",960,540);}

JavaCV相关专栏推荐

javacv实战专栏目录(更新至今):

JavaCV实战专栏文章目录(更新至今)

最新JavaCV最新音视频教程目录:

JavaCV音视频教程目录(最新JavaCV教程)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。