昨天情人节,写了个表白的小代码,将女友照片进行缩放,自动贴到我照片眼球处,表达“我的眼里只有你”。女友喜欢刘昊然,我这颜值是在不咋地,拿昊然弟弟照片来展示效果:
效果图
注意看眼睛位置
思路
Python可以直接调用dlib库进行人脸识别,其中也包含了准度较高的眼部识别。利用dlib面部识别库定位照片中眼球位置,将女友照片进行相应缩放,最终通过PIL将其贴图到眼球处。
dlib
dlib是一个高质量的机器学习、图像处理、深度学习、人脸识别 C++/Python库。Python中可以直接调用dlib库进行面部识别,其中也包含了准度较高的眼部识别,如下图:
通过37、38、40、41来确定左眼球位置,43、44、48、47来确定右眼球位置。获取点在照片中的坐标,计算距离来获取眼球区域信息。
裁剪处理眼球中贴图
因为眼球的形状,贴图最好处理成略小于眼球的圆形图,所以代码中先将女友照片缩小成眼球区域大小的矩形图,再进行边缘透明处理和裁剪生成。
def img_deal(input_img):
img = cv2.imread(input_img, cv2.IMREAD_UNCHANGED)
rows, cols, channel = img.shape
img_new = np.zeros((rows, cols, 4), np.uint8)
img_new[:, :, 0:3] = img[:, :, 0:3]
img_circle = np.zeros((rows, cols, 1), np.uint8)
img_circle[:, :, :] = 0
img_circle = cv2.circle(img_circle, (int(cols / 2), int(rows / 2)), int(min(rows, cols) / 2), 255, -1)
img_new[:, :, 3] = img_circle[:, :, 0]
cv2.imwrite('src_circle.png', img_new)
将女友照片缩放成小于该区域的图片,通过PIL将其贴到眼球位置上。
回顾
你可能会说,这很简单啊,PS一下就搞定,比你这还好看。
是的,有点杀鸡用牛刀的鸡肋感。但代码的好处是,设计好的程序高效地自动执行,我就可以专注于提升操作步骤之外的事情了。对于批量化生成图片也是很方便的。此外,除了图片,还可以通过摄像头在视频中进行操作。
昨天有了“眼中有你”的想法,尝试接触面部识别,效果不错有了些初步收获,后续仍需要更深入地学习和应用,跪求懂行的大佬给予指点、也欢迎感兴趣的朋友一起组团学习哈!
代码下载
网盘下载链接,提取码:os3o
Github链接
最后
新年刚过,充实、惬意。
希望更努力的工作和学习,在新的一年里带给我们更快的成长,加油!
如果觉着还可以,欢迎关注下我学习Python升级的公众号哈~