OpenCV之objdetect 模块. 物体检测:级联分类器
级联分类器
目标
在这节教程中您将学到:
- 使用 CascadeClassifier 类来检测视频流中的物体. 特别地, 我们将使用函数:
- load 来加载一个 .xml 分类器文件. 它既可以是Haar特征也可以是LBP特征的分类器.
- detectMultiScale 来进行图像的多尺度检测.
原理
代码
本教程的代码如下所示. 你也可以 点这里 下载. 第二个版本 (使用LBP进行人脸检测) 可以 从这里 找到.
#include "opencv2/objdetect/objdetect.hpp"#include "opencv2/highgui/highgui.hpp"#include "opencv2/imgproc/imgproc.hpp"#include <iostream>#include <stdio.h>using namespace std;using namespace cv;/** 函数声明 */void detectAndDisplay( Mat frame );/** 全局变量 */string face_cascade_name = "haarcascade_frontalface_alt.xml";string eyes_cascade_name = "haarcascade_eye_tree_eyeglasses.xml";CascadeClassifier face_cascade;CascadeClassifier eyes_cascade;string window_name = "Capture - Face detection";RNG rng(12345);/** @主函数 */int main( int argc, const char** argv ){CvCapture* capture;Mat frame;//-- 1. 加载级联分类器文件if( !face_cascade.load( face_cascade_name ) ){ printf("--(!)Error loading\n"); return -1; };if( !eyes_cascade.load( eyes_cascade_name ) ){ printf("--(!)Error loading\n"); return -1; };//-- 2. 打开内置摄像头视频流capture = cvCaptureFromCAM( -1 );if( capture ){while( true ){frame = cvQueryFrame( capture );//-- 3. 对当前帧使用分类器进行检测if( !frame.empty() ){ detectAndDisplay( frame ); }else{ printf(" --(!) No captured frame -- Break!"); break; }int c = waitKey(10);if( (char)c == 'c' ) { break; }}}return 0;}/** @函数 detectAndDisplay */ void detectAndDisplay( Mat frame ) {std::vector<Rect> faces;Mat frame_gray;cvtColor( frame, frame_gray, CV_BGR2GRAY );equalizeHist( frame_gray, frame_gray );//-- 多尺寸检测人脸face_cascade.detectMultiScale( frame_gray, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30) );for( int i = 0; i < faces.size(); i++ ){Point center( faces[i].x + faces[i].width*0.5, faces[i].y + faces[i].height*0.5 );ellipse( frame, center, Size( faces[i].width*0.5, faces[i].height*0.5), 0, 0, 360, Scalar( 255, 0, 255 ), 4, 8, 0 );Mat faceROI = frame_gray( faces[i] );std::vector<Rect> eyes;//-- 在每张人脸上检测双眼eyes_cascade.detectMultiScale( faceROI, eyes, 1.1, 2, 0 |CV_HAAR_SCALE_IMAGE, Size(30, 30) );for( int j = 0; j < eyes.size(); j++ ){Point center( faces[i].x + eyes[j].x + eyes[j].width*0.5, faces[i].y + eyes[j].y + eyes[j].height*0.5 );int radius = cvRound( (eyes[j].width + eyes[i].height)*0.25 );circle( frame, center, radius, Scalar( 255, 0, 0 ), 4, 8, 0 );}}//-- 显示结果图像imshow( window_name, frame );}
代码解释
结果
下图就是使用上述代码对内置摄像头的视频流进行人脸检测的结果图像:
注意复制分类器文件 haarcascade_frontalface_alt.xml 和 haarcascade_eye_tree_eyeglasses.xml 到你的当前目录下. 他们在OpenCV安装文件夹 opencv/data/haarcascades 里面.
下图是使用分类器文件 lbpcascade_frontalface.xml (LBP特征训练的) 进行的检测结果. 对于双眼的检测依旧使用刚才使用过的分类器.
OpenCV之objdetect 模块. 物体检测:级联分类器相关推荐
- 【OpenCV】车辆识别 目标检测 级联分类器 C++ 案例实现
目录 前言 一.目标检测技术 二.样本采集工作原理 三.创建自己的级联分类器 Step1:准备好样本图像 Step2:环境配置(OpenCV win10) Step3:设置路径 Step4:实现样本数 ...
- OpenCV中基于Haar特征和级联分类器的人脸检测
使用机器学习的方法进行人脸检测的第一步需要训练人脸分类器,这是一个耗时耗力的过程,需要收集大量的正负样本,并且样本质量的好坏对结果影响巨大,如果样本没有处理好,再优秀的机器学习分类算法都是零. 今年3 ...
- OpenCV中基于Haar特征和级联分类器的人脸检测(三)
使用机器学习的方法进行人脸检测的第一步需要训练人脸分类器,这是一个耗时耗力的过程,需要收集大量的正负样本,并且样本质量的好坏对结果影响巨大,如果样本没有处理好,再优秀的机器学习分类算法都是零. 今年3 ...
- 使用OpenCV的Haar特征训练身份证级联分类器
以下是我参考的几个人脸分类器的文章: http://blog.csdn.net/yangleo1987/article/details/52883864 http://m.blog.csdn.net/ ...
- C#,人工智能,深度学习,目标检测,OpenCV级联分类器数据集的制作与《层级分类器一键生成器》源代码
一.目标识别技术概述 1.摘要 目标检测是计算机视觉中最基本和最具挑战性的问题之一,它试图从自然图像中的大量预定义类别中定位目标实例.深度学习技术已成为直接从数据中学习特征表示的强大策略,并在通用目标 ...
- 利用OpenCV的级联分类器类CascadeClassifier和Haar特征实现人脸区域的检测
级联分类器是将若干个分类器进行连接,从而构成一种多项式级的强分类器.级联分类器使用前要先进行训练,怎么训练呢?用目标的特征值去训练,对于人脸来说,通常使用Haar特征进行训练. Haar特征是由M.O ...
- Haar特征和级联分类器目标检测介绍及应用
文章目录 Haar特征和级联分类器目标检测介绍及应用 1. Haar特征 2. 级联分类器 3. 实现步骤 4.尝试训练自己的级联分类器 4. 应用示例 Haar特征和级联分类器目标检测介绍及应用 H ...
- Qt +opencv 通过级联分类器训练的模型进行识别(车辆识别+人脸识别)
有不对的或更好的方法欢迎交流 一些内容可参照这篇文章:https://blog.csdn.net/m0_64596200/article/details/126748697?spm=1001.2014 ...
- OpenCV 3最新模块介绍
原文:https://zhuanlan.zhihu.com/p/19988205?columnSlug=hacker-and-painter OpenCV 3 的改动在哪? C 风格的API很快将会消 ...
最新文章
- Mybatis 使用的 9 种设计模式,真是太有用了
- PPT文字怎样规划 哪里可以代做PPT
- SDUT-2449_数据结构实验之栈与队列十:走迷宫
- 光缆故障测试_简单的测试可以防止最严重的故障
- 框架基础——全面解析Java注解
- leetcode279 完全平方数
- 最全Spring Boot2.x系列Config配置集成篇-1参数配置
- 浅谈Flutter的状态State
- python制作二维码
- Emacs lisp 列表与函数的区别
- PThread 学习笔记
- Flink 实战:如何解决生产环境中的技术难题?
- 结果概率_解疑:一批网申结果何时出?通过网申的概率有多大?
- 个人的Directx9研究总结 (1)
- 彻底搞懂虚拟地址翻译为物理地址的过程
- web前端移动端课程之canvas教程系列
- 2022华南师范大学软院软件工程考研经验贴(初试380)
- sql语句用法的一部分整理
- MATLAB数学经典建模之风扇特性:流量 随 压比函数值变化的图形 (2 维图形)
- 并发编程之CPU缓存架构缓存一致性协议详解(二)
热门文章
- Stanford NLP 解读 ACL 2018 论文——用于调试 NLP 模型的语义等价对立规则
- 逻辑回归、决策树和支持向量机(I)
- 帮Facebook把用户做到7亿的那个人,告诉你如何实现用户增长
- 那些年,程序员读错的英语
- Oracle-Soft Parse/Hard Parse/Soft Soft Parse解读
- RocketMQ:消息消费队列与索引文件的实时更新以及文件恢复源码解析
- 数据结构:栈实现逆波兰计算器
- Arrays.sort和Collection.sort分别使用什么排序来实现的
- 机器学习系列1:单变量线性回归
- 青少年学python第六节_青少年学Python(第2册)