【OpenCv小白入门】人脸检测

简介: 本篇小结是关于OpenCv小白入门的,分享一下自己的想法,并且较为详细的总结一下利用OpenCv自带的Haar分类器进行人脸检测以及基于OpenCV3.1+Vs2013+C++的具体代码实现。

本篇小结是关于OpenCv小白入门的,分享一下自己的想法,并且较为详细的总结一下利用OpenCv自带的Haar分类器进行人脸检测以及基于OpenCV3.1+Vs2013+C++的具体代码实现。
原文链接

没有实际的操作,一切都是扯淡:

怎么说,在我刚刚开始学习OpenCv的时候,疯狂的被安利学习OpenCV(中文版)数字图像处理不可否认,这些书确实是挺不错的,我也确实想把他们都细细的啃完;But,一考虑自己这个记忆力,怕是看完就忘记完了哦,再结合某人士说的,我们是站在巨人的肩膀上的我们应该从作中学,没有实际的操作,一切都是扯淡!

于是,借助OpenCv的友情链接的教程OpenCV Tutorial (C++)快速实现了入门。
之后,再借助国内码云找到了若干小项目练手。

  • 微信跳一跳,辅助程序, 有兴趣的可以瞅瞅:
    github

然后,根据自己的兴趣,开始学习人脸检测

实际操作:

* 区别"人脸检测"和"人脸识别":

人脸检测和人脸识别的区别

* 代码的具体实现过程:

img_bb36bfcb57664cb6498518e95c80a352.png
第一段代码
  • 这一段,前半部分主要是函数的声明,全局变量的声明,以及准备训练好的分类器文件;

  • 后面的main函数里面有2个函数, 分别是利用图片和摄像头作为输入,进行实时检测,这里只需要讲解图片作为输入即可。

img_629dd3d0d0bf8949cdfc856424d2313c.png
图片处理
  • 由于以及有了OpenCv训练好了的分类器文件,我们就只需要使用load这个方法进行加载即可:
bool cv::CascadeClassifier::load(const String & filename)   
  • 把图像转为黑白图像,并且进行直方图均衡文档
cvtColor(src_img, gray_img, COLOR_BGR2GRAY);
equalizeHist(gray_img, gray_img);
face_cascade.detectMultiScale(gray_img, faces, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30));
eyes_cascade.detectMultiScale(faceROI, eyes, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(50, 50));
  • 遍历检测到的所有脸,利用ellipse绘制椭圆,标记检测到的脸;由于眼睛是长在脸上的这个真理,在找到脸的基础上,利用detectMultiScale加载分类器,检测眼睛,并且利用circle绘制圆,做出标记:
    //-- Detect faces
    face_cascade.detectMultiScale(gray_img, faces, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30));
    for (size_t i = 0; i < faces.size(); i++)
    {
        Point center(faces[i].x + faces[i].width / 2, faces[i].y + faces[i].height / 2);
        ellipse(gray_img, center, Size(faces[i].width / 2, faces[i].height / 2), 0, 0, 360, Scalar(255, 0, 255), 4, 8, 0);
        Mat faceROI = gray_img(faces[i]);
        cout << "i:  " << i<< endl;
        std::vector<Rect> eyes;
        //-- In each face, detect eyes
        eyes_cascade.detectMultiScale(faceROI, eyes, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(50, 50));
        
        for (size_t j = 0; j < eyes.size(); j++)
        {
            Point eye_center(faces[i].x + eyes[j].x + eyes[j].width / 2, faces[i].y + eyes[j].y + eyes[j].height / 2);
            int radius = cvRound((eyes[j].width + eyes[j].height)*0.25);        //获取半径、cvRound将浮点数四舍五入到最接近的整数。
            cout << "radius:  "<<radius << endl;
            circle(gray_img, eye_center, radius, Scalar(255, 0, 0), 4, 8, 0);
        }
    }
  • 然后, imshow出来就是了

效果图以及源代码:

img_50eb235dc7eea600b9ee5eae3fb4d997.png
效果图

github

接下来的计划:

这个玩意,其实最核心还是那个分类器,计划下一步,去找个网站,用py写一条健壮的爬虫,整个几千张图下来,用python训练个分类器,检测一些其他的东西。

目录
相关文章
|
1月前
|
计算机视觉
Opencv学习笔记(八):如何通过cv2读取视频和摄像头来进行人脸检测(jetson nano)
如何使用OpenCV库通过cv2模块读取视频和摄像头进行人脸检测,并提供了相应的代码示例。
82 1
|
1月前
|
机器学习/深度学习 计算机视觉
目标检测笔记(六):如何结合特定区域进行目标检测(基于OpenCV的人脸检测实例)
本文介绍了如何使用OpenCV进行特定区域的目标检测,包括人脸检测实例,展示了两种实现方法和相应的代码。
64 1
目标检测笔记(六):如何结合特定区域进行目标检测(基于OpenCV的人脸检测实例)
|
5月前
|
机器学习/深度学习 Java 开发工具
【移花接木】OpenCV4.8 For Java 深度学习 实时人脸检测
【移花接木】OpenCV4.8 For Java 深度学习 实时人脸检测
102 0
|
1月前
|
算法 计算机视觉 Python
圆形检测算法-基于颜色和形状(opencv)
该代码实现了一个圆检测算法,用于识别视频中的红色、白色和蓝色圆形。通过将图像从RGB转换为HSV颜色空间,并设置对应颜色的阈值范围,提取出目标颜色的区域。接着对这些区域进行轮廓提取和面积筛选,使用霍夫圆变换检测圆形,并在原图上绘制检测结果。
65 0
|
4月前
|
机器学习/深度学习 传感器 算法
OpenCV4工业缺陷检测的六种方法
OpenCV4工业缺陷检测的六种方法
|
5月前
|
存储 编解码 算法
【Qt&OpenCV 检测图像中的线/圆/轮廓 HoughLinesP/HoughCircles/findContours&drawContours】
【Qt&OpenCV 检测图像中的线/圆/轮廓 HoughLinesP/HoughCircles/findContours&drawContours】
90 0
|
5月前
|
计算机视觉
【轻松入门】OpenCV4.8 + QT5.x开发环境搭建
【轻松入门】OpenCV4.8 + QT5.x开发环境搭建
80 0
【轻松入门】OpenCV4.8 + QT5.x开发环境搭建
|
6月前
|
数据采集 Java 数据挖掘
最新Python+OpenCV+dlib汽车驾驶员疲劳驾驶检测!,2024年最新网易云java面试
最新Python+OpenCV+dlib汽车驾驶员疲劳驾驶检测!,2024年最新网易云java面试
最新Python+OpenCV+dlib汽车驾驶员疲劳驾驶检测!,2024年最新网易云java面试
|
5月前
|
监控 安全 计算机视觉
实战 | 18行代码轻松实现人脸实时检测【附完整代码与源码详解】Opencv、人脸检测
实战 | 18行代码轻松实现人脸实时检测【附完整代码与源码详解】Opencv、人脸检测
|
5月前
|
算法 数据处理 计算机视觉
基于OpenCV的人脸对齐步骤详解及源码实现
基于OpenCV的人脸对齐步骤详解及源码实现