温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

python opencv怎么检测到人脸

发布时间:2022-01-04 09:56:50 来源:亿速云 阅读:147 作者:iii 栏目:大数据

这篇文章主要讲解了“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:

python opencv怎么检测到人脸

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

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

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

python opencv怎么检测到人脸

是不是很好看!感觉我就像变成了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<uchar>(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<Vec3b>(x + dx, y + dy)[0] = (uchar)b;            frame.at<Vec3b>(x + dx, y + dy)[1] = (uchar)g;            frame.at<Vec3b>(x + dx, y + dy)[2] = (uchar)r;          }        }      }    }  }  return frame;}

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

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

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI