使用OpenCV中的Haar特征检测图片中的人脸
一、概述
案例:使用OpenCV的Haar特征数据检测人脸。
相关API介绍
1.使用CascadeClassifier类
2.使用其load方法加载特征文件
3.使用其detectMultiScale方法在多尺度空间进行检测,其中该参数解释如下:
/** @brief Detects objects of different sizes in the input image. The detected objects are returned as a list of rectangles. @param 输入图像类型是CV_8U @param 输出矩阵,类型是vector<Rect> objects,其中每一个Rect代表一个人脸矩阵框,因为一副图中有可能包含多个人脸。 @param 这是多尺度空间下检测人脸的关键参数,其作用是:每次图像减小的比例,比例越小也就越准确,速度也就越慢,反之亦然 @param minNeighbors 关键参数,其代表的含义是,有多少个框框住了此人脸才算是目标人脸。其值越小误差越大。ps:检测人脸时并不是一下在就检测到一个框,而是会出现多个框框住一个人脸,框住的越多
则说明此框是人脸的可能性就越大。 @param minSize 目标的最小尺寸,此处最小必须>=24,因为这是特征向量中规定的。 @param maxSize 目标的最大尺寸,最大尺寸最好不要大鱼图片尺寸,常规测试用默认的就行。 */ CV_WRAP void detectMultiScale( InputArray image, CV_OUT std::vector<Rect>& objects, double scaleFactor = 1.1, int minNeighbors = 3, int flags = 0, Size minSize = Size(), Size maxSize = Size() );
实现图像人脸检测的步骤:
1.imread载入原图
2.使用cvtColor将图像转为灰度图
3.使用直方图均衡化均衡灰度图
4.实例化CascadeClassifier
5.加载特征文件(load方法)
6.在多尺度空间检测人脸(detectMultiScale)
7.得到检测到的人脸并绘制出
8.输出的Qt的Scene中并显示
二、代码演示
Mat src = imread(filePath); if(src.empty()){ qDebug()<<"图片为空"; return; } //人脸识别特征文件路径haar特征文件 String face_path = "/usr/local/share/opencv4/haarcascades/haarcascade_frontalface_alt.xml"; CascadeClassifier face_classifier;//初始化 if(!face_classifier.load(face_path)){//加载特征数据 qDebug()<<"特征数据加载失败"; return; } //gray Mat gray; cvtColor(src,gray,COLOR_BGR2GRAY);//转灰度图像 equalizeHist(gray,gray);//直方图均衡化 vector<Rect> faces;//存储检测到的人脸 face_classifier.detectMultiScale(gray,faces,1.1,3,0);//在不同的尺度空间检测人脸 for(size_t i=0;i<faces.size();i++){ rectangle(src,faces[i],Scalar(0,0,255),1,LINE_8);//将人脸绘制出来 } QImage image = ImageUtils::matToQImage(src); QPixmap pixmap = QPixmap::fromImage(image); QGraphicsPixmapItem *item = new QGraphicsPixmapItem(pixmap.scaled(this->size(),Qt::KeepAspectRatio,Qt::SmoothTransformation)); scene.addItem(item);
三、效果图展示


                    
                
                
            
        
浙公网安备 33010602011771号