三 (3.2) Opencv效果实现 - 人脸检测

2018-10-24  本文已影响0人  交大小丑

在OpenCV中主要使用了两种特征(即两种方法)进行人脸检测,Haar特征和LBP特征。

在OpenCV中,使用已经训练好的XML格式的分类器进行人脸检测。在OpenCV的安装目录下的sources文件夹里的data文件夹里可以看到下图所示的内容:

image.png

上图中文件夹的名字“haarcascades”、“hogcascades”和“lbpcascades”分别表示通过“haar”、“hog”和“lbp”三种不同的特征而训练出的分类器:即各文件夹里的文件。"haar"特征主要用于人脸检测,“hog”特征主要用于行人检测,“lbp”特征主要用于人脸识别。打开“haarcascades”文件夹,如下图所示

image.png

图中的XML文件即是我们人脸检测所需要的分类器文件。在实际使用中,推荐使用上图中被标记的“haarcascade_frontalface_alt2.xml”分类器文件,准确率和速度都比较好。

图片中的人脸检测

//头文件
#include<opencv2/objdetect/objdetect.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
 
using namespace cv;
 
//人脸检测的类
CascadeClassifier faceCascade;
 
int main()
{
    faceCascade.load("../data/haarcascade_frontalface_alt2.xml");   //加载分类器,注意文件路径
 
    Mat img = imread("../data/PrettyGirl.jpg");
    Mat imgGray;
    vector<Rect> faces;
 
    if(img.empty())
    {
      return 1;
    }
 
    if(img.channels() ==3)
    {
       cvtColor(img, imgGray, CV_RGB2GRAY);
    }
    else
    {
       imgGray = img;
    }
 
    faceCascade.detectMultiScale(imgGray, faces, 1.2, 6, 0, Size(0, 0));   //检测人脸
 
    if(faces.size()>0)
    {
       for(int i =0; i<faces.size(); i++)
       {
           rectangle(img, Point(faces[i].x, faces[i].y), Point(faces[i].x + faces[i].width, faces[i].y + faces[i].height), 
                           Scalar(0, 255, 0), 1, 8);    //框出人脸位置
       }
    }
 
    imshow("FacesOfPrettyGirl", img);
 
    waitKey(0);
    return 0;
}

视频/摄像头中的人脸检测

//头文件
#include<opencv2/objdetect/objdetect.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
 
using namespace cv;
 
//人脸检测的类
CascadeClassifier faceCascade;
 
int main()
{
    faceCascade.load("../data/haarcascade_frontalface_alt2.xml");   //加载分类器,注意文件路径
 
    VideoCapture cap;  
    cap.open(0);   //打开摄像头
    //cap.open("../data/test.avi");   //打开视频
    Mat img, imgGray;
    vector<Rect> faces;
    int c = 0;
 
    if(!cap.isOpened())
    {
      return 1;
    }
 
    while(c!=27)
    {
        cap>>img;
       if(img.channels() ==3)
       {
          cvtColor(img, imgGray, CV_RGB2GRAY);
       }
       else
       {
          imgGray = img;
       }
 
       faceCascade.detectMultiScale(imgGray, faces, 1.2, 6, 0, Size(0, 0));   //检测人脸
 
       if(faces.size()>0)
       {
          for(int i =0; i<faces.size(); i++)
          {
              rectangle(img, Point(faces[i].x, faces[i].y), Point(faces[i].x + faces[i].width, faces[i].y + faces[i].height), 
                              Scalar(0, 255, 0), 1, 8);    //框出人脸位置
          }
       }
    
       imshow("Camera", img);
       c = waitKey(1);
    }
    return 0;
}

人脸检测

【OpenCV人脸识别入门教程之二】人脸检测 - 生活,哭泣着奔向死亡,又放不下理想,挣扎着歌唱 - CSDN博客 https://blog.csdn.net/lsq2902101015/article/details/47057081

OpenCV人脸检测(完整源码+思路) - IT1995的博客 - CSDN博客 https://blog.csdn.net/qq78442761/article/details/61918994

人脸检测是人脸识别的基础,人脸识别的文章:
https://blog.csdn.net/qq78442761/article/details/61918994

上一篇下一篇

猜你喜欢

热点阅读