保护女神林志玲,给脸打马赛克pythonopencv实现
1 说明:
=====
1.1 python+opencv实现人脸定位、马赛克采用2种方法:dlib法和cv2自带xml法。
1.2 cv2自带xml法:加载人脸模型haarcascade_frontalface_default.xml
1.3 图片来源:来自今日头条正版免费图库,向女神致敬,仅供学习。
pic1:林志玲
pic2:林志玲等3人
2 加载opencv的xml模型法:有bug,此处省略。https://github.com/opencv/opencv/blob/master/data/haarcascades/haarcascade_frontalface_default.xml #下载
3 dlib法:
======
3.1 安装dlib:pip install dlib
3.2 效果图:
4 代码:
python的代码简洁,清晰,规范化的步骤
===============================
4.1 第1步:模块导入# 导入模块 import dlib import cv2
4.2 第2步:函数定义# 获得人脸矩形的坐标信息 def rect_to_fb(face): x = face.left() y = face.top() w = face.right() - x h = face.bottom() - y return (x, y, w, h) # 将待检测的image进行resize,调整大小 def resize(image, width=1200): r = width * 1.0 / image.shape[1] dim = (width, int(image.shape[0] * r)) resized = cv2.resize(image, dim, interpolation=cv2.INTER_AREA) return resized # 定义人脸马赛克=face_mosaic函数: def face_mosaic(image, x, y, w, h, m1w=9): """ :param img: opencv img :param int x : 马赛克左顶点 :param int y: 马赛克右顶点 :param int w: 马赛克宽 :param int h: 马赛克高 :param int m1w: 马赛克每一块的宽:mosaic 1 w """ # 获取读取图片的高和宽 img_h, img_w = image.shape[0], image.shape[1] # 当判断超过边界,返回 if (y + h > img_h) or (x + w > img_w): return # h==高:关键点0 减去m1w防止溢出 for i in range(0, h - m1w, m1w): # w==宽:关键点0 减去m1w防止溢出 for j in range(0, w - m1w, m1w): # 获得人脸矩形的坐标信息 rect = [j + x, i + y, m1w, m1w] # numpy中ndarray文件转为list color = image[i + y][j + x].tolist() # 关键点1 tolist # 获取对角线 left_up = (rect[0], rect[1]) # 关键点2 减去一个像素 right_down = (rect[0] + m1w - 1, rect[1] + m1w - 1) # 确定对角线 来画矩形的 # 比如: # cv2.rectangle(img, (bbox.left, bbox.top), (bbox.right, bbox.bottom), (0,0,255), 2) # 注意上面是2=小绿色框,1=部分小绿色宽,-1=无色马赛克,不显示绿色框 cv2.rectangle(image, left_up, right_down, color, -1)
4.3 第3步:main主函数# 人脸侦测,定位,打马赛克 def main(): # 读取原始图片 image_file = "/home/xgj/Desktop/masaike/pic2.jpeg" image = cv2.imread(image_file) # 调用函数,调整图片大小 image = resize(image, width=1200) # 调用dlib的函数获取人脸模型 detector = dlib.get_frontal_face_detector() # 获取人脸数据 faces = detector(image, 1) for (i, face) in enumerate(faces): (x, y, w, h) = rect_to_fb(face) # 人脸定位并加绿色矩形框 cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2) # cv2.putText(I,"there 0 error(s):",(50,150),cv2.FONT_HERSHEY_COMPLEX,6,(0,0,255),25) # 各参数依次是:照片/添加的文字/左上角坐标/字体/字体大小/颜色/字体粗细 cv2.putText(image, "Face:{}".format(i+1), (x - 10, y - 10),cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2) # 调用马赛克函数,打马赛克 face_mosaic(image, x, y, w, h) # 显示效果图片 cv2.imshow("Output", image) cv2.waitKey(0) #永不自动关闭
4.4 第4步:结尾if __name__ == "__main__": main()
5 小结:
=====
5.1 dlib法基本无bug,显示了dlib库在人脸识别和定位上的强大。
5.2 同时在使用OpenCV的自带人脸识别模型xml时出现上述2张照片bug,所以放弃使用,希望OpenCV这个强大的库能改进。 当然OpenCV还是一个很强大,很热门的计算机视觉库。
5.3 python代码规范的问题:要不要结尾if __name__ == "__main__":问题,好像python3中也不重要了,自己可以感受一下。
5.4 以上是个人心得,分享出来。
情感咨询栗子姐每日情感问答(0603)咨询栗子姐您好,我觉得我有心理疾病,我总是控制不住自己的情绪,每次有不顺心的事的时候总是想的很极端,和别人有什么冲突的时候会想着杀了对方,事后我自己也很害怕自己有这种想法,我是不是
情感咨询栗子姐每日情感问答(0610)咨询我和男朋友都是25岁,在一起六年多了,我本科毕业两年,在县城工作收入稳定,月薪除去五险一金六七千吧。男朋友三年前大专毕业,一会想做这个,一会想做那个,到现在还什么都没做成。最近
情感咨询栗子姐每日情感问答(0612)咨询老师好,我是男的,我非常喜欢的一个女生是同性恋怎么办?栗子姐点评你是异性恋,喜欢上一个同性恋的姑娘,还能怎么办?凉拌呗!!因为这姑娘她就不喜欢男人,这和你也不喜欢男人是一个道理
86万彩礼返还案与郎咸平和小三的争产大战恋爱两年分手后,男方起诉女方返还恋爱期间花费的86万财物的事件,在网上闹的沸沸扬扬。其实很多人并不知道这件事情的真相,今天栗子姐就给大家讲一讲。话说两年前26岁的山东姑娘徐小姐,遇
情感咨询栗子姐每日情感问答(0602)咨询在前不久添加了一个女孩儿。想和她真的谈一场轰轰烈烈的爱情。直到走到最后。但是她一开始就给我要钱。毕竟,我们两个连面都没有见过。关系也没有确定。这个怎么办?栗子姐点评也不知道你是
情感咨询栗子姐每日情感问答(0604)咨询马xx,这是我最后一次这样叫你那么多年我从来没有做过一件对不起你的事情,你说过你要什么样的女人都可以有,那我跟你说我要什么样的男人我也都可以有,但是我从来没有和你这样说过,因为
情感咨询栗子姐每日情感问答(0607)咨询相亲认识一男的,刚开始对我特别热情追的特别紧,还没见面看了照片就特别满意那种,每天都发信息视频,后来见了面,我也没有很快回应他,因为毕竟离婚过一次,不想那么快确定关系,过了差不
情感咨询栗子姐每日情感问答(0530)咨询男朋友家领养一个妹妹和男朋友一起长大的,她也知道自己是领养的,还跟我男朋友家要买房子,还买东西讨好男朋友爸妈,我应该继续吗?栗子姐点评法律上规定,私生子领养的孩子与婚生子女有同
情感咨询栗子姐每日情感问答(0531)咨询为什么我一个男人总是忘不了心爱的女人,我们刚刚分开了,是她先提出不在一起,之前我们很好的没有任何杂质在中间很纯粹的感情,但大概半年前她开始想离开,特别是这次疫情后她明确和我提出
情感咨询栗子姐每日情感问答(0705)咨询我和老公都是二婚,我有个8岁儿子,他有个13岁儿子,我们15年谈恋爱,中间分分合合,去年5月终于结婚,过了大半年,我们就因为琐事分居到现在,我知道婚姻的维系需要各方面的因素,我
微信情感咨询栗子姐每日情感问答(0630)咨询我想问怎样可以让我们的婚姻更好,我老公是去我们家的,然后我们买房子我老公也出了一大部分,现在老人来给我们接送孩子上学,我老公老是感觉不自由,感觉压抑,觉得我家庭气氛不好,我爸爸