C/C++开发,opencv-objdetect模块,CascadeClassifier人脸识别应用

目录

一、CascadeClassifier应用简介

1.1 objdetect模块

1.2 CascadeClassifier类

1.3 detectMultiScale函数详解

二、CascadeClassifier应用示例

2.1 模型及图片下载准备

2.2 程序代码

2.3 程序编译及运行


一、CascadeClassifier应用简介

1.1 objdetect模块

        在OpenCV中,objdetect模块提供了对象检测的功能,特别是基于预训练分类器的对象检测,如人脸检测、人体检测或其他特定目标的检测。

        以下是objdetect模块中常用的一些类和函数:

  1. CascadeClassifier
    CascadeClassifier类用于加载预训练的分类器,如Haar特征或LBP特征的级联分类器,通常用于人脸检测。加载分类器后,可以使用detectMultiScale函数在图像中检测对象。

  2. HOGDescriptor
    HOGDescriptor类用于计算图像的Histogram of Oriented Gradients(HOG)描述符,通常与SVM分类器结合使用,进行行人检测等任务。

  3. DNN(深度神经网络)
    虽然DNN不是objdetect模块的直接部分,但OpenCV提供了dnn模块,该模块可以用于加载和运行深度学习模型进行对象检测。例如,你可以使用YOLO、SSD或Faster R-CNN等模型进行对象检测。

  4. 其他检测器
    除了上述的Haar和HOG检测器外,objdetect模块还包含其他类型的对象检测器,如基于LSD(Line Segment Detector)的线检测器和基于轮廓的方法。但是,这些功能可能不像Haar和HOG那样直接在该模块中提供,而是需要一些额外的处理和编程。

1.2 CascadeClassifier类

   CascadeClassifier 类用于对象检测,特别是基于Haar或LBP特征的级联分类器的对象检测,这种检测方法通常用于人脸检测,但也可以用于其他目标,如眼睛、鼻子等。

        以下是使用 CascadeClassifier 类进行人脸检测的基本步骤:

  1. 加载级联分类器:首先,你需要加载一个预训练的级联分类器文件(通常是一个.xml文件)。这个文件包含了用于对象检测的级联函数和特征。对于人脸检测,OpenCV提供了一些预训练的模型,如haarcascade_frontalface_default.xml
  2. 读取图像:使用 imread 函数读取要检测的图像。
  3. 预处理图像(可选):对于某些级联分类器,将图像转换为灰度可能是必要的,因为级联分类器通常是在灰度图像上训练的。使用 cvtColor 函数进行转换。
  4. 检测对象:使用 CascadeClassifier 类的 detectMultiScale 函数在图像中检测对象。这个函数会返回一组矩形区域,表示检测到的对象的位置和大小。
  5. 绘制检测结果:使用 rectangle 函数在原始图像上绘制检测到的对象的边界框。
  6. 显示或保存结果:使用 imshow 函数显示结果图像,或使用 imwrite 函数将结果保存到文件。
1.3 detectMultiScale函数详解

  CascadeClassifier 类的 detectMultiScale 函数是用于在图像中检测多个对象(如人脸)的。这个函数基于Haar或LBP特征的级联分类器来工作,并返回一系列矩形(cv::Rect),这些矩形表示在图像中检测到的对象的位置。

void CascadeClassifier::detectMultiScale(  
    InputArray image,  
    std::vector<Rect>& objects,  
    double scaleFactor = 1.1,  
    int minNeighbors = 3,  
    int flags = 0,  
    Size minSize = Size(),  
    Size maxSize = Size()  
);

        参数说明:

  1. image:待检测的输入图像。它应该是灰度图像(CV_8UC1),除非你已经对彩色图像训练了特定的分类器。
  2. objects:一个向量,用于存储检测到的对象的矩形边界框。每个矩形由其左上角坐标 (x, y) 和宽高 (width, height) 定义。
  3. scaleFactor:比例因子,用于表示在每次图像缩放时的大小变化率。较小的值会产生更精确的结果,但也会增加计算时间。默认为1.1。
  4. minNeighbors:构成检测到的对象的相邻矩形的最小数量。如果数量太少,可能会丢弃该检测。这个参数可以减少误检(假阳性)。默认为3。
  5. flags:修改检测方式的标志。它可以是以下值的组合:
    • CASCADE_SCALE_IMAGE:在检测过程中按比例缩放图像。如果未设置此标志,则会按比例缩放分类器检测窗口。默认为设置此标志。
    • CASCADE_FIND_BIGGEST_OBJECT:只返回最大的对象检测。
    • CASCADE_DO_ROUGH_SEARCH:做初步检测,接受被其他级联拒绝的候选对象。这可能会增加误检,但可能会找到一些遗漏的对象。
  6. minSize:检测窗口的最小可能大小。小于此尺寸的窗口将被忽略。默认为空,表示没有限制。
  7. maxSize:检测窗口的最大可能大小。大于此尺寸的窗口将被忽略。默认为空,表示没有限制。

        返回值

        此函数没有返回值。检测到的对象边界框存储在传入的 objects 向量中。

二、CascadeClassifier应用示例

2.1 模型及图片下载准备

        需要用到预先训练好的模型“haarcascade_frontalface_default.xml”,前往gitee网站下载haarcascade_frontalface_default.xml · Miwat/face_recognition_LBPH - Gitee.com

        前往网上,下载人物图片用于人脸识别验证。

2.2 程序代码

        main.cpp实现

#include <opencv2/opencv.hpp>  
#include <opencv2/objdetect/objdetect.hpp>  

int main(int argc, char** argv)  
{  
    // 加载预训练的人脸分类器  
    cv::CascadeClassifier face_cascade;  
    if (!face_cascade.load("haarcascade_frontalface_default.xml"))  
    {  
        std::cerr << "--(!)Error loading face cascade\n";  
        return -1;  
    }  

    // 读取图像  
    cv::Mat image = cv::imread(argv[1], cv::IMREAD_COLOR);  
    if (image.empty())  
    {  
        std::cerr << "--(!)Error loading image\n";  
        return -1;  
    }  

    // 转换为灰度图像(大多数级联分类器在灰度图像上工作得更好)  
    cv::Mat gray;  
    cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY);  
    //获取训练集的原始尺寸,作为分类器的最小尺寸,这样能得到最佳的检测效果(不是必须的)
	// cv::Size original_size = face_cascade.getOriginalWindowSize();
    // std::cerr << "original_size = " << original_size << "\n";
    // 检测人脸  
    std::vector<cv::Rect> faces;  
    face_cascade.detectMultiScale(gray, faces, 1.1, 2, 0 | cv::CASCADE_SCALE_IMAGE, cv::Size(24, 16)/*original_size*//*cv::Size(30, 30)*/);  
    std::cerr << "faces.size() = " << faces.size() << "\n";
    // 在图像上绘制检测到的人脸  
    for (size_t i = 0; i < faces.size(); i++)  
    {  
        cv::rectangle(image, faces[i], cv::Scalar(255, 0, 0), 2);  
    }  

    // 显示结果  
    cv::imshow("Faces", image);  
    cv::waitKey(0);  

    return 0;  
}
2.3 程序编译及运行

        本文是采用win系统下,opencv采用MinGW编译的静态库(C/C++开发,win下OpenCV+MinGW编译环境搭建_opencv mingw-CSDN博客),建立makefile:

#/bin/sh
#win32
CX= g++ -DWIN32 
#linux
#CX= g++ -Dlinux 

BIN 		:= ./
TARGET      := opencv_objdetect01.exe
FLAGS		:= -std=c++11 -static
SRCDIR 		:= ./
#INCLUDES
INCLUDEDIR 	:= -I"../../opencv_MinGW/include" -I"./"
#-I"$(SRCDIR)"
staticDir   := ../../opencv_MinGW/x64/mingw/staticlib/
#LIBDIR		:= $(staticDir)/libopencv_world460.a\
#			   $(staticDir)/libade.a \
#			   $(staticDir)/libIlmImf.a \
#			   $(staticDir)/libquirc.a \
#			   $(staticDir)/libzlib.a \
#			   $(wildcard $(staticDir)/liblib*.a) \
#			   -lgdi32 -lComDlg32 -lOleAut32 -lOle32 -luuid 
#opencv_world放弃前,然后是opencv依赖的第三方库,后面的库是MinGW编译工具的库

LIBDIR 	    := -L $(staticDir) -lopencv_world460 -lade -lIlmImf -lquirc -lzlib \
				-llibjpeg-turbo -llibopenjp2 -llibpng -llibprotobuf -llibtiff -llibwebp \
				-lgdi32 -lComDlg32 -lOleAut32 -lOle32 -luuid 
source		:= $(wildcard $(SRCDIR)/*.cpp) 

$(TARGET) :
	$(CX) $(FLAGS) $(INCLUDEDIR) $(source)  -o $(BIN)/$(TARGET) $(LIBDIR)

clean:
	rm  $(BIN)/$(TARGET)

        编译如下:

        程序运行输出如下:

        大家可以调节各个参数来观察其效果。

相关推荐

  1. opencv进行人脸识别

    2024-06-06 22:00:08       48 阅读
  2. opencv动态识别人脸

    2024-06-06 22:00:08       35 阅读
  3. opencv实现视频人脸识别

    2024-06-06 22:00:08       43 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-06 22:00:08       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-06 22:00:08       100 阅读
  3. 在Django里面运行非项目文件

    2024-06-06 22:00:08       82 阅读
  4. Python语言-面向对象

    2024-06-06 22:00:08       91 阅读

热门阅读

  1. WPS超级会员4年,2024年到手值得!

    2024-06-06 22:00:08       109 阅读
  2. 【python】匿名函数

    2024-06-06 22:00:08       30 阅读
  3. 东方博宜1542 - 小X算排名

    2024-06-06 22:00:08       25 阅读
  4. CSS中绝对定位和百分比问题(CSS中的小细节)

    2024-06-06 22:00:08       30 阅读
  5. CSS变量 -- var() 使用教程

    2024-06-06 22:00:08       23 阅读
  6. CSS简述(1)

    2024-06-06 22:00:08       23 阅读
  7. 9. 媒体查询与响应式设计

    2024-06-06 22:00:08       29 阅读
  8. 网络安全中攻击溯源方法

    2024-06-06 22:00:08       27 阅读
  9. Ant-Design-Vue动态表头并填充数据

    2024-06-06 22:00:08       29 阅读
  10. Unreal Engine游戏引擎小白入门指南

    2024-06-06 22:00:08       31 阅读
  11. SQL常用语句--模糊查询LIKE

    2024-06-06 22:00:08       31 阅读
  12. 一篇想要成为Python编程大佬,看这篇就够了

    2024-06-06 22:00:08       36 阅读
  13. 通过Slf4j中的MDC实现在日志中添加用户IP功能

    2024-06-06 22:00:08       32 阅读