def morph_img(src_img, src_points, dst_img, dst_points, alpha=0.5): morph_points = [] src_img = src_img.astype(np.float32) dst_img = dst_img.astype(np.float32) res_img = np.zeros(src_img.shape, src_img.dtype) for i in range(0, len(src_points)): x = (1 - alpha) * src_points[i][0] + alpha * dst_points[i][0] y = (1 - alpha) * src_points[i][1] + alpha * dst_points[i][1] morph_points.append((x, y)) dt = core.measure_triangle(src_img, morph_points) for i in range(0, len(dt)): t1 = [] t2 = [] t = [] for j in range(0, 3): t1.append(src_points[dt[i][j]]) t2.append(dst_points[dt[i][j]]) t.append(morph_points[dt[i][j]]) core.morph_triangle(src_img, dst_img, res_img, t1, t2, t, alpha) return res_img
def tran_src(src_img, src_points, dst_points, face_area=None): # print(1111111) print(src_img.shape) jaw = core.JAW_END dst_list = dst_points \ + core.matrix_rectangle(face_area[0], face_area[1], face_area[2], face_area[3]) \ + core.matrix_rectangle(0, 0, src_img.shape[1], src_img.shape[0]) src_list = src_points \ + core.matrix_rectangle(face_area[0], face_area[1], face_area[2], face_area[3]) \ + core.matrix_rectangle(0, 0, src_img.shape[1], src_img.shape[0]) jaw_points = [] for i in range(0, jaw): # print(i) jaw_points.append(dst_list[i]) jaw_points.append(src_list[i]) warp_jaw = cv2.convexHull(np.array(jaw_points), returnPoints=False) warp_jaw = warp_jaw.tolist() for i in range(0, len(warp_jaw)): warp_jaw[i] = warp_jaw[i][0] warp_jaw.sort() if len(warp_jaw) <= jaw: dst_list = dst_list[jaw - len(warp_jaw):] src_list = src_list[jaw - len(warp_jaw):] for i in range(0, len(warp_jaw)): dst_list[i] = jaw_points[int(warp_jaw[i])] src_list[i] = jaw_points[int(warp_jaw[i])] else: for i in range(0, jaw): if len(warp_jaw) > jaw and warp_jaw[i] == 2 * i and warp_jaw[ i + 1] == 2 * i + 1: warp_jaw.remove(2 * i) dst_list[i] = jaw_points[int(warp_jaw[i])] dt = core.measure_triangle(src_img, dst_list, src_points, dst_points) res_img = np.zeros(src_img.shape, dtype=src_img.dtype) for i in range(0, len(dt)): t_src = [] t_dst = [] for j in range(0, 3): t_src.append(src_list[dt[i][j]]) t_dst.append(dst_list[dt[i][j]]) if (checkLine(t_src) or checkLine(t_dst)): # print("not checked") continue else: core.affine_triangle(src_img, res_img, t_src, t_dst) return res_img
def morph_img(src_img, src_points, dst_img, dst_points, alpha=0.5): morph_points = [] src_img = src_img.astype(np.float32) dst_img = dst_img.astype(np.float32) res_img = np.zeros(src_img.shape, src_img.dtype) # for i in src_points: # print(i) # 这一步的目的是调整脸型,将原图关键点和目标图关键点之间取中间点,根据alpha值来取 for i in range(0, len(src_points)): x = (1 - alpha) * src_points[i][0] + alpha * dst_points[i][0] y = (1 - alpha) * src_points[i][1] + alpha * dst_points[i][1] morph_points.append((x, y)) dt = core.measure_triangle(src_img, morph_points, src_points, dst_points) for i in range(0, len(dt)): t1 = [] t2 = [] t = [] for j in range(0, 3): t1.append(src_points[dt[i][j]]) t2.append(dst_points[dt[i][j]]) t.append(morph_points[dt[i][j]]) if (checkLine(t) or checkLine(t1) or checkLine(t2)): continue core.morph_triangle(src_img, dst_img, res_img, t1, t2, t, alpha, i) return res_img
def tran_src(src_img, src_points, dst_points, face_area=None): jaw = core.JAW_END newface = get_auto_facearae(src_points, src_img) dst_list = dst_points \ + core.matrix_rectangle(newface[0], newface[1], newface[2], newface[3]) \ + core.matrix_rectangle(0, 0, src_img.shape[1], src_img.shape[0]) src_list = src_points \ + core.matrix_rectangle(newface[0], newface[1], newface[2], newface[3]) \ + core.matrix_rectangle(0, 0, src_img.shape[1], src_img.shape[0]) jaw_points = [] for i in range(0, jaw): jaw_points.append(dst_list[i]) jaw_points.append(src_list[i]) warp_jaw = cv2.convexHull(np.array(jaw_points), returnPoints=False) warp_jaw = warp_jaw.tolist() for i in range(0, len(warp_jaw)): warp_jaw[i] = warp_jaw[i][0] warp_jaw.sort() if len(warp_jaw) <= jaw: dst_list = dst_list[jaw - len(warp_jaw):] src_list = src_list[jaw - len(warp_jaw):] for i in range(0, len(warp_jaw)): dst_list[i] = jaw_points[int(warp_jaw[i])] src_list[i] = jaw_points[int(warp_jaw[i])] else: for i in range(0, jaw): if len(warp_jaw) > jaw and warp_jaw[i] == 2 * i and warp_jaw[ i + 1] == 2 * i + 1: warp_jaw.remove(2 * i) dst_list[i] = jaw_points[int(warp_jaw[i])] dt = core.measure_triangle(src_img, dst_list) res_img = np.zeros(src_img.shape, dtype=src_img.dtype) for i in range(0, len(dt)): t_src = [] t_dst = [] for j in range(0, 3): t_src.append(src_list[dt[i][j]]) t_dst.append(dst_list[dt[i][j]]) core.affine_triangle(src_img, res_img, t_src, t_dst) return res_img
def tran_src(src_img, src_points, dst_points, face_area=None): # jaw = core.JAW_END dst_list = dst_points \ + core.matrix_rectangle(face_area[0], face_area[1], face_area[2], face_area[3]) \ + core.matrix_rectangle(0, 0, src_img.shape[1], src_img.shape[0]) src_list = src_points \ + core.matrix_rectangle(face_area[0], face_area[1], face_area[2], face_area[3]) \ + core.matrix_rectangle(0, 0, src_img.shape[1], src_img.shape[0]) # jaw_points = [] # for i in range(0, jaw): # jaw_points.append(dst_list[i]) # jaw_points.append(src_list[i]) # warp_jaw = cv2.convexHull(np.array(jaw_points), returnPoints=False) # warp_jaw = warp_jaw.tolist() # for i in range(0, len(warp_jaw)): # warp_jaw[i] = warp_jaw[i][0] # warp_jaw.sort() # if len(warp_jaw) <= jaw: # dst_list = dst_list[jaw - len(warp_jaw):] # src_list = src_list[jaw - len(warp_jaw):] # for i in range(0, len(warp_jaw)): # dst_list[i] = jaw_points[int(warp_jaw[i])] # src_list[i] = jaw_points[int(warp_jaw[i])] # else: # for i in range(0, jaw): # if len(warp_jaw) > jaw and warp_jaw[i] == 2 * i and warp_jaw[i + 1] == 2 * i + 1: # warp_jaw.remove(2 * i) # dst_list[i] = jaw_points[int(warp_jaw[i])] dt = core.measure_triangle(src_img.shape, dst_list) res_img = np.zeros(src_img.shape, dtype=src_img.dtype) for i in range(0, len(dt)): t_src = [] t_dst = [] for j in range(0, 3): t_src.append(src_list[dt[i][j]]) t_dst.append(dst_list[dt[i][j]]) core.affine_triangle(src_img, res_img, t_src, t_dst) return res_img
def morph_img(src_img, src_points, dst_img, dst_points, alpha=0.5,show_bg=None): # test time start = time.time() src_img = src_img.astype(np.float32) dst_img = dst_img.astype(np.float32) morph_points = [] if show_bg: res_img = src_img.copy() else: res_img = np.zeros(src_img.shape, src_img.dtype) for i in range(0, len(src_points)): x = (1 - alpha) * src_points[i][0] + alpha * dst_points[i][0] y = (1 - alpha) * src_points[i][1] + alpha * dst_points[i][1] morph_points.append((x, y)) # dt = core.measure_triangle(src_img, morph_points) dt = core.measure_triangle(src_img, src_points) for i in range(0, len(dt)): t1 = [] t2 = [] t = [] for j in range(0, 3): t1.append(src_points[dt[i][j]]) t2.append(dst_points[dt[i][j]]) t.append(morph_points[dt[i][j]]) core.morph_triangle(src_img, dst_img, res_img, t1, t2, t, alpha) stop = time.time() print("morph_img用时"+str(stop-start)+"秒") return res_img