import cv2
import dlib
import numpy as np
from mopi import beauty_face2
img_file = '1.jpg'
img = cv2.imread(img_file)
src = img
img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
predictor_path = 'shape_predictor_68_face_landmarks.dat'
# 使用dlib自带的frontal_face_detector作为我们的特征提取器
#检测框提取器
detector = dlib.get_frontal_face_detector()
#关键点提取器
predictor = dlib.shape_predictor(predictor_path)
land_marks = []
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#获取检测框
rects = detector(img_gray, 0)
#获取所有人脸检测框的关键点
for i in range(len(rects)):land_marks_node = np.matrix([[p.x, p.y] for p in predictor(img_gray, rects[i]).parts()])land_marks.append(land_marks_node)
#绘制坐标框
def get_landmarks(img):rects = detector(img, 1)if len(rects) > 1:raise TooManyFacesif len(rects) == 0:raise NoFacesdraw = img.copy()for _, d in enumerate(rects):cv2.rectangle(draw, (d.left(), d.top()), (d.right(), d.bottom()), (0, 255, 0), 3)return np.matrix([[p.x, p.y] for p in predictor(img, rects[0]).parts()])
#计算偏移坐标
def move_up(x):list = [[0 for j in range(2)] for _ in range(9)]for i in range (9):list[i][1]=xreturn list
list = np.array(move_up(100))
def get_image_size(image):"""获取图片大小(高度,宽度):param image: image:return: (高度,宽度)"""image_size = (image.shape[0], image.shape[1])return image_size
def get_face_mask(image_size, face_landmarks):"""获取人脸掩模:param image_size: 图片大小:param face_landmarks: 68个特征点:return: image_mask, 掩模图片"""mask = np.zeros(image_size, dtype=np.uint8)etou_point = np.array(face_landmarks[26:17:-1])etou_point = etou_point - listpoints = np.concatenate([face_landmarks[0:16], etou_point])#print(type(points))cv2.fillPoly(img=mask, pts=[points], color=255)# mask = np.zeros(image_size, dtype=np.uint8)# points = cv2.convexHull(face_landmarks)  # 凸包# cv2.fillConvexPoly(mask, points, color=255)return mask
def get_eye_mask(image_size, face_landmarks):"""获取人脸掩模:param image_size: 图片大小:param face_landmarks: 68个特征点:return: image_mask, 掩模图片"""mask1 = np.zeros(image_size, dtype=np.uint8)#points = np.concatenate([face_landmarks[36:41], face_landmarks[42:47]])points = face_landmarks[36:41]cv2.fillPoly(img=mask1, pts=[points], color=255)mask2 = np.zeros(image_size, dtype=np.uint8)#points = np.concatenate([face_landmarks[36:41], face_landmarks[42:47]])points = face_landmarks[42:47]cv2.fillPoly(img=mask2, pts=[points], color=255)mask3 = np.zeros(image_size, dtype=np.uint8)# points = np.concatenate([face_landmarks[36:41], face_landmarks[42:47]])points = face_landmarks[42:47]cv2.fillPoly(img=mask2, pts=[points], color=255)# mask = np.zeros(image_size, dtype=np.uint8)# points = cv2.convexHull(face_landmarks)  # 凸包# cv2.fillConvexPoly(mask, points, color=255)mask3 = np.zeros(image_size, dtype=np.uint8)# points = np.concatenate([face_landmarks[36:41], face_landmarks[42:47]])points = face_landmarks[48:59]cv2.fillPoly(img=mask3, pts=[points], color=255)return mask1,mask2,mask3
#对人脸进行美颜
mopisrc = beauty_face2(src)
def get_image_size(image):"""获取图片大小(高度,宽度):param image: image:return: (高度,宽度)"""image_size = (image.shape[0], image.shape[1])return image_size
im_size = get_image_size(src)  # 脸图大小
landmarks = get_landmarks(src)  # 68_face_landmarks
im_mask = get_face_mask(im_size, landmarks)  # 脸图人脸掩模
#points = np.concatenate([face_landmarks[0:16], face_landmarks[26:17:-1]])# im1(脸图)仿射变换后的图片的人脸掩模的中心点
def get_mask_center_point(image_mask):"""获取掩模的中心点坐标:param image_mask: 掩模图片:return: 掩模中心"""image_mask_index = np.argwhere(image_mask > 0)miny, minx = np.min(image_mask_index, axis=0)maxy, maxx = np.max(image_mask_index, axis=0)center_point = ((maxx + minx) // 2, (maxy + miny) // 2)return center_point
#获取掩膜中心点
point = get_mask_center_point(im_mask)
#人脸掩膜融合
mask1,mask2,mask3 = get_eye_mask(im_size,landmarks)
mask_face = get_face_mask(im_size,landmarks)
# mask1 = cv2.bitwise_not(mask1)
# mask2 = cv2.bitwise_not(mask2)
mask = mask_face-(mask1+mask2+mask3)
seamless_im = cv2.seamlessClone(mopisrc, src, mask=mask, p=point, flags=cv2.NORMAL_CLONE)# 进行泊松融合
seamless_im2 = cv2.seamlessClone(mopisrc, src, mask=mask_face, p=point, flags=cv2.NORMAL_CLONE)# 进行泊松融合cv2.imshow('im',mask)
cv2.imshow('seamless_im',seamless_im)
cv2.imshow('seamless_im2',seamless_im2)
# cv2.imshow('src',src)
cv2.waitKey(0)

利用opencv生成面膜相关推荐

  1. python 多帧 超分辨_利用python-opencv生成视频帧数控制,和常见错误总结

    首先呢 利用opencv生成视频的例子相信网络上已经很多了.但是大多数例子都只是捕获一个摄像头就没了.但是在实际运用中会发现.因为涉及到图像处理,生成的视频要不就就是过快要不就是比实际时间长. 控制视 ...

  2. pythonopencv读取视频帧慢_利用python-opencv生成视频帧数控制,和常见错误总结

    首先呢 利用opencv生成视频的例子相信网络上已经很多了.但是大多数例子都只是捕获一个摄像头就没了.但是在实际运用中会发现.因为涉及到图像处理,生成的视频要不就就是过快要不就是比实际时间长. 控制视 ...

  3. 利用Opencv保存图片,并生成JPG格式,调整压缩质量。

     例如Photoshop软件保存JPG图像时有低.中.高和最佳的保存选项设置,对应生成的图像的大小也不同.用OpenCV生成的图像相对较大,可能类似对应Photoshop最佳的那种保存的,但是我想 ...

  4. 使用Python,OpenCV生成Aruco标记

    这篇博客将介绍Aruco标记是什么,以及如何使用Python,OpenCV生成Aruco标记.本文提供俩种生成方式:在线生成和代码生成: 使用OpenCV处理ArUco标签非常简单,因为OpenCV库 ...

  5. 利用OpenCV、Python和Ubidots构建行人计数器程序(附完整代码)

    作者 | Jose Garcia 译者 | 吴振东 校对 | 张一豪.林亦霖,编辑 | 于腾凯 来源 | 数据派(ID:datapi) 导读:本文将利用OpenCV,Python和Ubidots来编写 ...

  6. opencv resize_利用OpenCV 识别两张相似的图片

    Background: 在我们项目中,用到U-net,我们对训练样本图片使用labelme进行标定,对标定生成的json文件labelme_json_to_dataset生成标注图像,由于小伙伴将生成 ...

  7. 独家|OpenCV1.9 如何利用OpenCV的parallel_for_并行化代码(附代码)

    翻译:陈之炎 校对:顾伟嵩本文约3200字,建议阅读7分钟本教程的目标是展示如何使用OpenCV的parallel_for_框架轻松实现代码并行化. 目标 本教程的目标是展示如何使用OpenCV的pa ...

  8. opencv 取roi_利用OpenCV 识别两张相似的图片

    Background: 在我们项目中,用到U-net,我们对训练样本图片使用labelme进行标定,对标定生成的json文件labelme_json_to_dataset生成标注图像,由于小伙伴将生成 ...

  9. python中import cv2遇到的错误及安装方法_独家利用OpenCV,Python和Ubidots来构建行人计数器程序(附代码amp;解析)...

    作者:Jose Garcia 翻译:吴振东 校对:张一豪 本文约4000字,建议阅读14分钟. 本文将利用OpenCV,Python和Ubidots来编写一个行人计数器程序,并对代码进行了较为详细的讲 ...

  10. 利用OpenCV实现图像拼接的代码

    图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 图像拼接是利用连续帧图像生成全景图或更高分辨率的 ...

最新文章

  1. 2.3.3 进程互斥的硬件实现方法
  2. How to use external classes and PHP files in Laravel Controller?
  3. emui消息推送服务器,别再抱怨,这次或许真的轮到你了,EMUI9.1推送进度再次更新...
  4. eclipse定义和修改模板
  5. [码海拾贝 之TC] 呼叫外部应用程序或脚本
  6. HibernateUtil类(可用于连接多个数据库)
  7. 一本名不符实的.NET书籍: Game Engine Toolset Development
  8. PyCharm使用技巧:windows下快捷键Ctrl+Alt+左箭头(后退)和Ctrl+Alt+右箭头(前进)冲突问题
  9. 组装手机DIY时代或将到来
  10. keystore was tampered with,or password was incorrect解决办法
  11. java.lang.IllegalStateException: Cannot get a STRING value from a NUMERIC cell 问题的解决
  12. 发现微型计算机染有病毒后,??发现微型计算机染有病毒后,较为彻底的清除方法是(?? )...
  13. JavaScript 内存溢出解决办法 亲测有效
  14. PaaS architecture
  15. java中属性是什么意思啊_Java中的字段和属性到底有什么区别?
  16. The Class File Viewer cannot handle the given input
  17. python高级--数据分析(Pandas库)
  18. 小米手机通过adb安装应用异常处理
  19. 浅谈云上攻防——对象存储服务访问策略评估机制研究
  20. 哪些浙大MEM提前批面试的申请者材料容易被刷?

热门文章

  1. 机器学习算法与Python学习
  2. Android LeakCanary的使用和原理
  3. 如何进行用户访谈更容易获得全面而有效的信息
  4. sar —— Linux 上最为全面的系统性能分析工具之一
  5. Linux的基本权限和特殊权限
  6. Centos硬盘IO性能检测命令iostat[转]
  7. Effective C++ 条款 50:了解new和delete的合理替换时机
  8. 第11周学习进度情况
  9. Android.DebugTools.Traceview dmtracedump
  10. DEDE织梦标签名称:{/dede:arclist} 详解