• 肤色高斯概率模型,主要将颜色空间从RGB转换为YCrCb,计算肤色的相似度,确定根据概率阈值筛选出肤色区域。但高斯概率模型中肤色均值及协方差矩阵需要提前确定,并且肤色均值对检测结果影响非常大,需要根据实际情况进行调整。
    #include <iostream>#include "opencv2/opencv.hpp"#include <ctime>  using namespace std;using namespace cv;void fillHole(Mat * src);//基于漫水填充的孔洞填充#define PI 3.14156void main (){Mat src = imread("1.jpg");if (src.empty()){cout << "read image error!" << endl;return ;}//基于高斯肤色概率模型的人脸检测结果const char * src_namedWindow = "src";imshow (src_namedWindow , src);Mat tempImg ;cvtColor (src, tempImg,CV_RGB2YCrCb );//将颜色空间从RGB转换为YCrCbvector <Mat> channels;split (tempImg,channels);//分离出CrCb通道Mat Cr_Img, Cb_Img;Cr_Img = channels[1];Cb_Img = channels[2];   //利用二维高斯概率模型计算每个像素点的肤色相似度Mat pro(Cr_Img.size(), CV_32FC1 );//定义相似度矩阵for (int i = 0; i<src.rows ; i++)for (int j = 0; j < src.cols ; j++){       Mat chr = (Mat_<double>(1, 2) << Cr_Img.at<uchar>(i, j), Cb_Img.at<uchar>(i, j) );//定义色度矩阵Mat m = (Mat_<double>(1, 2) << 120.4316, 148.5599);//肤色均值,即定义高斯分布的期望值。Mat cov = (Mat_<double>(2, 2)<< 97.0946, 24.4700, 24.4700, 141.9966);//协方差矩阵Mat ss=(-0.5)*(chr-m)*cov.inv()*(chr-m).t();pro.at<float>(i,j)=exp(ss.at<double>(0))/(2*PI *sqrt(determinant (cov)));//计算相似度//cout << exp(ss.at<double>(0))/(2*PI*sqrt(determinant (cov)))<< endl;}//imshow ("相似度矩阵", pro );//相似度矩阵归一化//double min1=0, max1=0;//minMaxIdx (pro, &min1, &max1);//cout << max1 << endl;//Mat nor = pro/max1;Mat nor;normalize (pro, nor,0,1,NORM_MINMAX );//imshow("归一化矩阵", nor);Mat mask1 = Mat :: zeros (pro.size(), CV_32FC1 );//肤色区模板Mat mask2 (mask1.size(), CV_8UC1 ); double thresh_face = 0.5;//肤色阈值for (int i = 0; i < nor.rows; i++ )for ( int j = 0; j < nor.cols ; j++){if (nor.at<float>(i,j) > thresh_face )mask1.at<float>(i,j) = 1;else mask1.at<float>(i,j) = 0;}imshow("人脸模板", mask1);      Mat element1 = getStructuringElement (MORPH_RECT,Size(3,3));erode(mask1, mask1,element1, Point(-1,-1), 2);Mat element2 = getStructuringElement (MORPH_ELLIPSE, Size(5,5));dilate (mask1, mask1,element2);threshold(mask1, mask2, 0,255,CV_THRESH_BINARY );//将mask1转为二值图mask2.convertTo (mask2, CV_8UC1 );//将矩阵转为图片//二值化图孔洞填充fillHole(&mask2);imshow ("填充后", mask2);//轮廓查找vector<vector<Point>> contours;vector<Vec4i> hierarchy;findContours (mask2, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE );//筛选轮廓vector<int> label;int add_lable = 0;vector<Rect> boundRect(contours.size());//定义外接矩形集合for (int i =0; i < contours.size(); i++){double con_area = contourArea (contours[i]);double con_length = arcLength (contours[i], true);int x0 =0, y0 =0, w0 =0, h0 =0;boundRect[i] = boundingRect (contours[i]);x0 = boundRect[i].x;y0 = boundRect[i].y;w0 = boundRect[i].width;h0 = boundRect[i].height;if (con_area > 400 && w0 > 20 && h0 > 20 && (h0/w0)>0.6 && (h0/w0)<2 ){drawContours (mask2, contours,i, Scalar (255, 0, 0), 1, 8);rectangle (src, Point(x0, y0), Point(x0+w0, y0+h0), Scalar (0, 255, 0), 2, 8);putText (src, "Face", Point(x0+w0/4, y0), CV_FONT_HERSHEY_SIMPLEX,0.5,Scalar(0,255,0), 2 );label.push_back (i);}   }imshow("mask2", mask2);imshow("人脸区",src);waitKey(0);//system ("pause");}void fillHole2(Mat *src)//利用漫水填充进行孔洞填充{Mat temp = Mat::zeros((src->size().height ) + 2, (src->size().width)+2, src->type());src->copyTo (temp(Range (1,(src->size().height ) + 1),Range (1,(src->size().width)+1)));floodFill (temp, Point(0,0),Scalar (255));//imshow("floodFill", temp);Mat cutImg;//将图像还原为原来大小temp(Range (1,(src->size().height ) + 1),Range (1,(src->size().width)+1)).copyTo (cutImg );*src = (*src) | (~ cutImg );}

参考文献

孔洞填充
https://bbs.csdn.net/topics/391542633?page=1
https://blog.csdn.net/qq_20823641/article/details/52186629
https://blog.csdn.net/wxplol/article/details/73137397
图像计算
https://blog.csdn.net/fengbingchun/article/details/72357082
https://blog.csdn.net/qq_29796317/article/details/73136083
人脸检测—基于肤色高斯概率的检测实现
https://wenku.baidu.com/view/0478da5d4431b90d6c85c7aa.html
https://blog.csdn.net/mao19931004/article/details/48933435
https://blog.csdn.net/tiemaxiaosu/article/details/51741486
http://blog.sina.com.cn/s/blog_4a540be60102uwcr.html
https://blog.csdn.net/zdx19880830/article/details/45892739
https://blog.csdn.net/wj080211140/article/details/23384927

基于肤色高斯概率模型的人脸检测相关推荐

  1. matlab rgb 到 ycgcr,基于混合肤色模型的快速人脸检测算法

    摘   要: 提出了一种基于混合肤色模型" title="肤色模型">肤色模型" title="肤色模型">肤色模型" ...

  2. python 视频人脸替换_Python基于OpenCV实现视频的人脸检测

    本文实例为大家分享了基于OpenCV实现视频的人脸检测具体代码,供大家参考,具体内容如下 前提条件 1.摄像头 2.已安装Python和OpenCV3 代码 import cv2 import sys ...

  3. python视频人脸检测_Python基于OpenCV实现视频的人脸检测

    本文实例为大家分享了基于OpenCV实现视频的人脸检测具体代码,供大家参考,具体内容如下 前提条件 1.摄像头 2.已安装Python和OpenCV3 代码 import cv2 import sys ...

  4. 基于Android平台的简易人脸检测库

    代码地址如下: http://www.demodashi.com/demo/12135.html ViseFace 简易人脸检测库,不依赖三方库,可快速接入人脸检测功能. 项目依赖:compile ' ...

  5. 基于OpenCV的视频处理 - 人脸检测

    一个不知名大学生,江湖人称菜狗 original author: jacky Li Email : 3435673055@qq.com  Time of completion:2023.2.7 Las ...

  6. 基于Pyramidbox实现的大规模人脸检测

    前言 今天来水一片文章,基于开源的Pyramidbox大规模人脸检测编写的PaddlePaddle教程,为了方便训练预测,本教程做了一定的修改.这个模型虽然大,但是符合大规模人群中也可以准确地检测到人 ...

  7. 基于Haar分类器的OpenCV人脸检测实例

    一.人脸的Haar特征分类器是什么 人脸的Haar特征分类器就是一个XML文件,该文件中会描述人脸的Haar特征值.当然Haar特征的用途可不止可以用来描述人脸这一种,用来描述眼睛,嘴唇或是其它物体也 ...

  8. OpenFace库(Tadas Baltrusaitis)中基于Haar Cascade Classifiers进行人脸检测的测试代码

    Tadas Baltrusaitis的OpenFace是一个开源的面部行为分析工具,它的源码可以从 https://github.com/TadasBaltrusaitis/OpenFace 下载.O ...

  9. OpenFace库(Tadas Baltrusaitis)中基于HOG进行正脸人脸检测的测试代码

    Tadas Baltrusaitis的OpenFace是一个开源的面部行为分析工具,它的源码可以从https://github.com/TadasBaltrusaitis/OpenFace下载.Ope ...

最新文章

  1. 微信小程序用户未授权bug解决方法,微信小程序获取用户信息失败解决方法
  2. python使用matplotlib可视化堆积的折线图、使用stackplot函数可视化堆积的折线图、不同数据在垂直方向堆叠
  3. 剁馅机器人图片_冲破面皮的束缚,“馅”入美味之中
  4. VS Code 全部快捷键一览表(巨TM全)
  5. ASP.NET 5 Beta7发布
  6. 人工智能进行时:人类的未来与未来的人类
  7. 设置搜狗浏览器为默认浏览器时被360拦截怎么办?
  8. Tomcat(三):日志
  9. fileoutputstream 文件不存在_总结Java中创建并写文件的5种方式
  10. Spring pom配置详解(转)
  11. 计算机理工 教学计划,教学计划格式-华南理工大学计算机科学与工程学院.DOC
  12. AMPL-最短路选择问题
  13. uuid java 36位_java 生成UUID 36位码 36位码
  14. 微信公众平台卡劵功能接入指南
  15. 微信授权登录 java_[JAVA实现]微信公众号网页授权登录
  16. (轉貼) 馬英九特別費案起訴書全文 (News)
  17. Android编译自定义sdk,向Android SDK中添加自定义的库 (Addon)
  18. 生物化学 电阻抗成像OpenEIT,Dbar算法,数据集等(暂记)
  19. JAVA中BitSet使用
  20. mock详细教程入门这一篇就够了(*)

热门文章

  1. 原西北大学校长郝克刚教授在中服PaaS云平台技术研讨会上的讲话
  2. 信息收集(一)域名信息收集
  3. java开发微信设计论文_集客微信公众号: 本科毕业设计:基于WxJava框架的集客微信公众号的设计与实现...
  4. EI检索的期刊要怎么区别是否是EI检索
  5. JavaWeb 服务器与客户端储存
  6. (转)视觉工程师笔试知识汇总
  7. IDEA中pom.xml文件图标变红,而不是蓝问题
  8. Masonry中的mas_makeConstraints方法
  9. 31.3 Java进阶之lambda方法引用
  10. python爬取视频自动播放_求助该网站如何让它能自动播放下一个视频。。。醉了,要挂80个课时...