千家信息网

python opencv怎么检测到人脸

发表于:2024-11-30 作者:千家信息网编辑
千家信息网最后更新 2024年11月30日,这篇文章主要讲解了"python opencv怎么检测到人脸",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"python opencv怎么检测到人脸"吧
千家信息网最后更新 2024年11月30日python opencv怎么检测到人脸

这篇文章主要讲解了"python opencv怎么检测到人脸",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"python opencv怎么检测到人脸"吧!

程序如何检测到人脸

人脸的识别当然方法很多啦,尤其是二寸照片这么简单直接的类型。不过实在没必要人脸检测,可以再观察下照片:

除了背景的蓝色就是衣服的白色后者头发的黑色还有皮肤的黄色,所以很好区分的嘛,可以利用直方图反投影,关于直方图反投影不清楚的可以点这篇:唉,再再再学一下直方图:直方图反投影

int main(){  //【1】读取原图片以及投影模板  Mat srcImage, dstImage;  srcImage = imread("肖像.jpg",33);  imshow("原图", srcImage);
Mat RoiImage = imread("投影模板.png"); //【2】转HSV模型 Mat HsvImage, RoiImage_HSV; cvtColor(srcImage, HsvImage, COLOR_BGR2HSV); cvtColor(RoiImage, RoiImage_HSV, COLOR_BGR2HSV); //【3】计算公路的直方图 MatND roiHist; //直方图对象 int dims = 2; //特征数目(直方图维度) float hranges[] = { 0,180 }; //特征空间的取值范围 float Sranges[] = { 0,256 }; const float *ranges[] = { hranges,Sranges }; int size[] = { 20,32 }; //存放每个维度的直方图的尺寸的数组 int channels[] = { 0,1 }; //通道数 calcHist(&RoiImage_HSV, 1, channels, Mat(), roiHist, dims, size, ranges); //【4】直方图归一化 normalize(roiHist, roiHist, 0, 255, NORM_MINMAX);
//【5】反向投影 Mat proImage; //投影输出图像 calcBackProject(&HsvImage, 1, channels, roiHist, proImage, ranges); imshow("投影", proImage); //图像掩码Mask操作 Mat maskImage; threshold(proImage, maskImage, 1, 255, THRESH_BINARY);//对mask进行二值化,将mask进一步处理 imshow("二值腌膜", maskImage); dstImage = Mat::zeros(srcImage.size(), CV_8UC3); srcImage.copyTo(dstImage, maskImage); imshow("掩码操作", dstImage);
waitKey(); return 0;}

这段代码就是利用直方图得到了一幅mask图像,其中人脸部分为255,其余部分为0:

左图为直方图反投影之后得到的投影(灰度图),右图为对投影图进行二值化后得到的二值mask。

之后调用自定义打码函数对标记mask区域进行打码:

  //自定义打码函数  Mat MosaicImage = trans2Mosaic(srcImage, maskImage, 10);  imshow("马赛克效果图", MosaicImage);

是不是很好看!感觉我就像变成了X战警钻石女王那样似的~

自定义函数代码,函数输入顺次为原图,图像腌膜,马赛克大小:

//原图,腌膜,马赛克大小Mat trans2Mosaic(Mat srcImage, Mat maskImage, int half_patch) {  Point2d point;//  Mat frame, mask;  srcImage.copyTo(frame);  maskImage.copyTo(mask);  int height = frame.rows;//获取图像的长宽  int width = frame.cols;  //遍历图像,步长为马赛克大小  for (int x = 0; x < height; x = x + half_patch) {    for (int y = 0; y < width; y = y + half_patch) {      //如果不是标记区域,则跳过      if (mask.at(x, y) ==0 ) {        continue;      }      else { //如果是标记区域,对像素进行重赋值        int b = theRNG().uniform(0, 255);        int g = theRNG().uniform(0, 255);        int r = theRNG().uniform(0, 255);        for (int dx = 0; dx < half_patch; dx++) {          for (int dy = 0; dy < half_patch; dy++) {            frame.at(x + dx, y + dy)[0] = (uchar)b;            frame.at(x + dx, y + dy)[1] = (uchar)g;            frame.at(x + dx, y + dy)[2] = (uchar)r;          }        }      }    }  }  return frame;}

该函数思路很简单,就是遍历图像像素点,遍历的步长为自定义的马赛克大小,然后判断该像素点是否属于标记(人脸)区域,否则跳过,是则以改点为起点遍历改点左侧以及下侧一个马赛克大小的区域,并将该区域像素随机赋值。

感谢各位的阅读,以上就是"python opencv怎么检测到人脸"的内容了,经过本文的学习后,相信大家对python opencv怎么检测到人脸这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

0