我来自Unity世界,正在尝试用Python编写一些东西,所以我不知道“UV”是否是正确的术语。我想做的是拍摄一个人的照片(通过网络摄像头),获取他们的地标/关键特征的位置,然后调整另一张图片(不同的人)的关键特征,使其与第一个输入图像(网络摄像头)的地标位置一致,同时变形/扭曲脸部皮肤内的部分以适应第一个输入图像的地标位置。完成后,我需要将脸部放回非网络摄像头输入的图像上。(对不起,我的描述听起来像是连环杀手,在拉伸和切割脸部)我知道这可能听起来不太合理,但我希望它看起来像这个视频中的效果。
我已经使用DLIB
和OpenCV
完成了面部地标检测和切割,但我需要一种方法来动态拉伸这些“切割”的面部块。我所说的动态是指不仅仅是线性地在1或2个轴上调整大小来戴上面具。你可以选择面具上的一个点并改变它,我想做到这一点,但我的面具是我的切割块,而点是需要改变的块的一部分,以便块符合生成的地标位置。我知道这是一个很难思考的话题,如果你们需要任何澄清,请随时问。我的代码如下:
import cv2import numpy as npimport dlibcap = cv2.VideoCapture(0)detector = dlib.get_frontal_face_detector()predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")while True: _, frame = cap.read() gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) faces = detector(gray) for face in faces: x1 = face.left() y1 = face.top() x2 = face.right() y2 = face.bottom() cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 3) landmarks = predictor(gray, face) for n in range(0, 68): x = landmarks.part(n).x y = landmarks.part(n).y cv2.circle(frame, (x, y), 4, (255, 0, 0), -1) cv2.imshow("Frame", frame) key = cv2.waitKey(1) if key == 27: break
编辑:不,我不是连环杀手
回答:
如果你需要像橡皮片一样变形源图像,使用两组关键点,你需要使用薄板样条(TPS),或者更好的是使用像这里展示的分段仿射变换。后者更类似于纹理光栅化方法(三角形到三角形的纹理变换)。