def adjustBlenAlpha(*args): global points1, points2, dt, imNorm1, imNorm2 alpha = float(args[0]) / 10 pointsMorph = (1 - alpha) * points1 + alpha * points2 imOut1 = fbc.warpImage(imNorm1, points1, pointsMorph.tolist(), dt) imOut2 = fbc.warpImage(imNorm2, points2, pointsMorph.tolist(), dt) imMorph = (1 - alpha) * imOut1 + alpha * imOut2 cv2.imshow("Morphed Face", imMorph)
def morphImages(alpha, imgNorm1, postions1, imgNorm2, postions2, dt): pointsMorph = (1.0 - alpha) * points1 + alpha * points2 imOut1 = fbc.warpImage(imgNorm1, points1, pointsMorph, dt) imOut2 = fbc.warpImage(imgNorm2, points2, pointsMorph, dt) imMorph = (1 - alpha) * imOut1 + alpha * imOut2 imgShow = np.zeros((480, 480 * 3, 3), dtype=float) imgShow = cv2.hconcat([imgNorm1, imgNorm2, imMorph]) cv2.imshow(winName, imgShow)
pointsAvg = pointsAvg + (points/(1.0*numImages)) # 添加边界点 points = np.concatenate((points, boundaryPts), axis=0) pointsNorm.append(points) imagesNorm.append(img) pointsAvg = np.concatenate((pointsAvg, boundaryPts), axis=0) # 计算delaunay三角形 rect = (0, 0, w, h) dt = fbc.calculateDelaunayTriangles(rect, pointsAvg) # 输出图像 output = np.zeros((h, w, 3), dtype=np.float) for i in range(0, numImages): imWarp = fbc.warpImage(imagesNorm[i], pointsNorm[i], pointsAvg.tolist(), dt) output = output + imWarp output = output/(1.0*numImages) cv2.imshow("Result", output) cv2.waitKey(0)
# Find forehead points appendForeheadPoints(points1) appendForeheadPoints(points2) # Find Delaunay Triangulation sizeImg1 = img1.shape rect = (0, 0, sizeImg1[1], sizeImg1[0]) dt = fbc.calculateDelaunayTriangles(rect, points1) # Convert image for warping img1 = np.float32(img1)/255.0 img2 = np.float32(img2)/255.0 # Warp wrinkle image to face image img1Warped = np.copy(img2) img1Warped = fbc.warpImage(img1, img1Warped, points1, points2, dt, useOutputImageSize=True) img1Warped = np.uint8(img1Warped*255.0) img2 = np.uint8(img2*255.0) # Calculate face mask for seamless cloning mask = getFaceMask(img2.shape[0:2], points2) # Seamlessly clone the wrinkle image onto original face r1 = cv2.boundingRect(np.float32(points2)) # Bounding rectangle r1 has 4 elements: left(x1), top(y1), width(w), height(h) center1X = r1[0] + int(r1[2]/2.0) center1Y = r1[1] + int(r1[3]/2.0) center1 = (center1X, center1Y) clonedOutput = cv2.seamlessClone(img1Warped, img2, mask, center1, cv2.MIXED_CLONE) # Blurring face mask to alpha blend to hide seams
pointsAvg = np.concatenate((pointsAvg, boundaryPoints), axis=0) # Calculate Delaunay triangulation. rect = (0, 0, w, h) dt = fbc.calculateDelaunayTriangles(rect, pointsAvg) # Start animation. alpha = 0 increaseAlpha = True while True: # Compute landmark points based on morphing parameter alpha pointsMorph = (1 - alpha) * points1 + alpha * points2 # Warp images such that normalized points line up with morphed points. imOut1 = fbc.warpImage(imNorm1, points1, pointsMorph.tolist(), dt) imOut2 = fbc.warpImage(imNorm2, points2, pointsMorph.tolist(), dt) # Blend warped images based on morphing parameter alpha imMorph = (1 - alpha) * imOut1 + alpha * imOut2 # Keep animating by ensuring alpha stays between 0 and 1. if (alpha <= 0 and not increaseAlpha): increaseAlpha = True if (alpha >= 1 and increaseAlpha): increaseAlpha = False if increaseAlpha: alpha += 0.025 else: alpha -= 0.025