有没有一种简单的方法可以将纹理映射到 python 中的不同“UV”系统?

Posted

技术标签:

【中文标题】有没有一种简单的方法可以将纹理映射到 python 中的不同“UV”系统?【英文标题】:Is there a simple way to map a texture to a different "UV" system in python? 【发布时间】:2020-09-16 13:58:22 【问题描述】:

我真的不知道“UV's”是否是正确的词,因为我来自 Unity 世界并且正在尝试用 python 编写一些东西。我想要做的是拍摄一个人的照片(来自网络摄像头),放置他们的地标/关键特征并改变第二张图像(另一个人的),以在变形的同时使他们的关键特征在同一个地方/ 扭曲面部内的皮肤部分以适应第一个输入图像(网络摄像头)的地标的位置。在我这样做之后,我需要把脸放回非网络摄像头输入上。 (我很抱歉这让我听起来像个连环杀手,拉长脸和剪脸)我知道这可能没有任何意义,但我希望它看起来像 this。

我已经用DLIBOpenCV 完成了面部标志和切割,但我需要一种方法来找到一种方法来获取这些“切割”的面部块并“动态地”拉伸它们。我所说的动态的意思是,您不只是通过在 1 或 2 个轴上线性调整其大小来放置遮罩。您可以选择蒙版的一个点并更改它,我想这样做,但我的蒙版是我的剪切块,并且该点是该块的一部分,需要更改该块以符合生成的地标的位置。我知道这是一个很难思考的话题,如果你们需要任何澄清,请询问。我的代码:

import cv2
import numpy as np
import dlib

cap = 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

编辑:不,我不是连环杀手

【问题讨论】:

类似this? 【参考方案1】:

如果您需要使用 2 组关键点将源图像像橡皮布一样变形,则需要使用thin plate spline (TPS),或者更好的是,像here 这样的分段仿射变换。最后一种更类似于纹理光栅化方法(三角形到三角形纹理变换)。

【讨论】:

以上是关于有没有一种简单的方法可以将纹理映射到 python 中的不同“UV”系统?的主要内容,如果未能解决你的问题,请参考以下文章

有没有一种方便的方法可以将文件 uri 映射到 os.path?

通用三角形网格的简单纹理映射

OC纹理投射、转换节点属性讲解0022

OpenGL纹理映射总结

3d一些术语

如何使用点图元将纹理映射到由参数方程渲染的球体