导语
现在每一次出门,女友就喜欢拍照!BUT 嫌弃我给拍的照片角度不对,采光不好…….
果然都是锻炼出来的,至少现在我能看出来朋友圈哪些小姐姐批没批过照片。
逃不掉啊,为了摆脱这种局面——
立马给女友写了一款简易版本的美颜相机给她偷偷的用!这样子就不担心被锤了。机智如我.jpg
正文
环境安装:
dlib库的安装 本博客提供三种方法进行安装 T1方法:pip install dlib 此方法是需要在你安装cmake、Boost环境的计算机使用 。 T2方法:conda install -c menpo dlib=18.18此方法适合那些已经安装好conda库的环境的计算机使用。 T3方法:pip install dlib-19.8.1-cp36-cp36m-win_amd64.whl dlib库的whl文件——dlib-19.7.0-cp36-cp36m-win_amd64.rar dlib-19.3.1-cp35-cp35m-win_amd64.whl
cv2库安装方法: pip install opencv-python
人脸五官,坐标、进行高斯模糊处理等等。
# 五官 class Organ(): def __init__(self, img, img_hsv, temp_img, temp_hsv, landmarks, name, ksize=None): self.img = img self.img_hsv = img_hsv self.landmarks = landmarks self.name = name self.get_rect() self.shape = (int(self.bottom-self.top), int(self.right-self.left)) self.size = self.shape[0] * self.shape[1] * 3 self.move = int(np.sqrt(self.size/3)/20) self.ksize = self.get_ksize() self.patch_img, self.patch_hsv = self.get_patch(self.img), self.get_patch(self.img_hsv) self.set_temp(temp_img, temp_hsv) self.patch_mask = self.get_mask_relative() # 获取定位方框 def get_rect(self): y, x = self.landmarks[:, 1], self.landmarks[:, 0] self.top, self.bottom, self.left, self.right = np.min(y), np.max(y), np.min(x), np.max(x) # 获得ksize,高斯模糊处理的参数 def get_ksize(self, rate=15): size = max([int(np.sqrt(self.size/3)/rate), 1]) size = (size if size%2==1 else size+1) return(size, size) # 截取局部切片 def get_patch(self, img): shape = img.shape return img[np.max([self.top-self.move, 0]): np.min([self.bottom+self.move, shape[0]]), np.max([self.left-self.move, 0]): np.min([self.right+self.move, shape[1]])] def set_temp(self, temp_img, temp_hsv): self.img_temp, self.hsv_temp = temp_img, temp_hsv self.patch_img_temp, self.patch_hsv_temp = self.get_patch(self.img_temp), self.get_patch(self.hsv_temp) # 确认 def confirm(self): self.img[:], self.img_hsv[:] = self.img_temp[:], self.hsv_temp[:] # 更新 def update_temp(self): self.img_temp[:], self.hsv_temp[:] = self.img[:], self.img_hsv[:] # 勾画凸多边形 def _draw_convex_hull(self, img, points, color): points = cv2.convexHull(points) cv2.fillConvexPoly(img, points, color=color) # 获得局部相对坐标遮盖 def get_mask_relative(self, ksize=None): if ksize == None: ksize = self.ksize landmarks_re = self.landmarks.copy() landmarks_re[:, 1] -= np.max([self.top-self.move, 0]) landmarks_re[:, 0] -= np.max([self.left-self.move, 0]) mask = np.zeros(self.patch_img.shape[:2], dtype=np.float64) self._draw_convex_hull(mask, landmarks_re, color=1) mask = np.array([mask, mask, mask]).transpose((1, 2, 0)) mask = (cv2.GaussianBlur(mask, ksize, 0) > 0) * 1.0 return cv2.GaussianBlur(mask, ks<div>本文来源gaodai.ma#com搞##代!^码@网3</div>ize, 0)[:] # 获得全局绝对坐标遮盖 def get_mask_abs(self, ksize=None): if ksize == None: ksize = self.ksize mask = np.zeros(self.img.shape, dtype=np.float64) patch = self.get_patch(mask) patch[:] = self.patch_mask[:] return mask