千家信息网

如何用Python给头像制作一顶圣诞帽

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章给大家介绍如何用Python给头像制作一顶圣诞帽,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。每年到这个时候,微信好友的头像都会开始换上「圣诞」皮肤。最常见的就是加个圣诞
千家信息网最后更新 2026年11月03日如何用Python给头像制作一顶圣诞帽

这篇文章给大家介绍如何用Python给头像制作一顶圣诞帽,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

每年到这个时候,微信好友的头像都会开始换上「圣诞」皮肤。最常见的就是加个圣诞小帽子了。

那么作为程序员,有没有办法呢?有

用到的工具:

  • OpenCV(毕竟我们主要的内容就是 OpenCV...)

  • dlib(dlib 的人脸检测比 OpenCV 更好用,而且 dlib 有 OpenCV 没有的关键点检测。)

用到的语言:

  • Python,但是完全可以改成 C++ 版本。

素材准备

首先我们需要准备一个圣诞帽的素材,格式***为 PNG,因为 PNG 的话我们可以直接用 Alpha 通道作为掩膜使用。

我们用到的圣诞帽如下图:

我们通过通道分离可以得到圣诞帽图像的 Alpha 通道。代码如下:

r,g,b,a = cv2.split(hat_img)  rgb_hat = cv2.merge((r,g,b))  cv2.imwrite("hat_alpha.jpg",a)

为了能够与 rgb 通道的头像图片进行运算,我们把 rgb 三通道合成一张 rgb 的彩色帽子图。

Alpha 通道的图像如下图所示:

人脸检测与人脸关键点检测

我们用下面这张图作为我们的测试图片:

下面我们用 dlib 的正脸检测器进行人脸检测,用 dlib 提供的模型提取人脸的五个关键点。

代码如下:

# dlib人脸关键点检测器       predictor_path = "shape_predictor_5_face_landmarks.dat"       predictor = dlib.shape_predictor(predictor_path)          # dlib正脸检测器       detector = dlib.get_frontal_face_detector()        # 正脸检测       dets = detector(img, 1)        # 如果检测到人脸       if len(dets)>0:             for d in dets:               x,y,w,h = d.left(),d.top(), d.right()-d.left(), d.bottom()-d.top()               # x,y,w,h = faceRect                 cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2,8,0)                # 关键点检测,5个关键点               shape = predictor(img, d)               for point in shape.parts():                   cv2.circle(img,(point.x,point.y),3,color=(0,255,0))                cv2.imshow("image",img)               cv2.waitKey()

这部分效果如下图:

调整帽子大小

我们选取两个眼角的点,求中心作为放置帽子的 x 方向的参考坐标,y 方向的坐标用人脸框上线的 y 坐标表示。

然后我们根据人脸检测得到的人脸的大小调整帽子的大小,使得帽子大小合适。

# 选取左右眼眼角的点               point1 = shape.part(0)               point2 = shape.part(2)                # 求两点中心               eyes_center = ((point1.x+point2.x)//2,(point1.y+point2.y)//2)                # cv2.circle(img,eyes_center,3,color=(0,255,0))                 # cv2.imshow("image",img)               # cv2.waitKey()                #  根据人脸大小调整帽子大小               factor = 1.5               resized_hat_h = int(round(rgb_hat.shape[0]*w/rgb_hat.shape[1]*factor))               resized_hat_w = int(round(rgb_hat.shape[1]*w/rgb_hat.shape[1]*factor))                if resized_hat_h > y:                   resized_hat_h = y-1                # 根据人脸大小调整帽子大小               resized_hat = cv2.resize(rgb_hat,(resized_hat_w,resized_hat_h))

提取帽子和需要添加帽子的区域

按照之前所述,去 Alpha 通道作为 mask,并求反。这两个 mask 一个用于把帽子图中的帽子区域取出来,一个用于把人物图中需要填帽子的区域空出来。

后面你将会看到:

# 用alpha通道作为mask               mask = cv2.resize(a,(resized_hat_w,resized_hat_h))               mask_inv =  cv2.bitwise_not(mask)

从原图中取出需要添加帽子的区域,这里我们用的是位运算操作。

# 帽子相对与人脸框上线的偏移量               dh = 0               dw = 0               # 原图ROI               # bg_roi = img[y+dh-resized_hat_h:y+dh, x+dw:x+dw+resized_hat_w]               bg_roi = img[y+dh-resized_hat_h:y+dh,(eyes_center[0]-resized_hat_w//3):(eyes_center[0]+resized_hat_w//3*2)]                # 原图ROI中提取放帽子的区域               bg_roi = bg_roi.astype(float)               mask_inv = cv2.merge((mask_inv,mask_inv,mask_inv))               alpha = mask_inv.astype(float)/255                # 相乘之前保证两者大小一致(可能会由于四舍五入原因不一致)               alpha = cv2.resize(alpha,(bg_roi.shape[1],bg_roi.shape[0]))               # print("alpha size: ",alpha.shape)               # print("bg_roi size: ",bg_roi.shape)               bg = cv2.multiply(alpha, bg_roi)               bg = bg.astype('uint8')

这是的背景区域(bg)如下图所示。可以看到,刚好是需要填充帽子的区域缺失了。

然后我们提取帽子区域,代码如下:

# 提取帽子区域    hat = cv2.bitwise_and(resized_hat,resized_hat,mask = mask)

提取得到的帽子区域如下图。帽子区域正好与上一个背景区域互补。

添加圣诞帽

***我们把两个区域相加。再放回到原图中去,就可以得到我们想要的圣诞帽图了。

这里需要注意的就是,相加之前 resize 一下保证两者大小一致,因为可能会由于四舍五入原因不一致。

# 相加之前保证两者大小一致(可能会由于四舍五入原因不一致)               hat = cv2.resize(hat,(bg_roi.shape[1],bg_roi.shape[0]))               # 两个ROI区域相加               add_hat = cv2.add(bg,hat)               # cv2.imshow("add_hat",add_hat)                 # 把添加好帽子的区域放回原图               img[y+dh-resized_hat_h:y+dh,(eyes_center[0]-resized_hat_w//3):(eyes_center[0]+resized_hat_w//3*2)] = add_hat

我们得到的效果图如下图所示:

祝大家圣诞节快乐!

关于如何用Python给头像制作一顶圣诞帽就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

帽子 区域 人脸 检测 大小 通道 一致 关键 关键点 原图 头像 两个 调整 四舍五入 代码 内容 原因 坐标 就是 检测器 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 科技互联网 江苏根荣互联网科技 为想互联网科技怎么样 科技与互联网 互联网科技社 善班互联网科技有限公司 伴你行互联网科技有限公司 科技类的互联网平台 汉立互联网科技有限公司联系电话 青岛中康互联网医疗科技有限公司 广州优美互联网科技 中化能源互联网科技招聘 南山科技园互联网公司有哪些 厦门千工互联网科技有限公司 河南住房之家互联网科技 深圳艾果互联网通讯科技 佛山市拉法互联网科技有限公司 皮皮虾互联网科技有限公司 张召忠谈中国互联网科技 厦门江牛科技互联网 互联网科技工作委员会 江苏根荣互联网科技 科技股互联网 金融科技创新监管互联网金融 互联网科技博客 安控科技rtu产品工业互联网 贵州叶脉互联网科技有限公司所属行业 武汉健翔互联网络科技有限公司 电子科技大学互联网创业大赛 洛阳共同富裕互联网科技有限公司
0