Есть ли простой способ сопоставить текстуру с другой "UV" системой в python? - PullRequest
0 голосов
/ 29 мая 2020

Я действительно не знаю, правильное ли слово "UV's", так как я из мира Unity и пытаюсь написать кое-что на python. То, что я пытаюсь сделать, - это сфотографировать человека (с веб-камеры), разместить его ориентиры / ключевые особенности и изменить второе изображение (другого человека), чтобы их ключевые черты находились в одном месте при морфинге. / деформируют части кожи, которые находятся внутри лица, в соответствии с положением ориентиров первого входного изображения (веб-камеры). После этого мне нужно вернуть лицо на вход без веб-камеры. (прошу прощения за то, насколько это заставило меня походить на серийного убийцу, растягивающего и режущего лица) Я знаю, что это, вероятно, не имело никакого смысла, но я хочу, чтобы это выглядело как это .

У меня есть ориентир лица и вырезание сделано с помощью DLIB и OpenCV, но мне нужен способ найти способ взять эти «вырезанные» части лица и растянуть их «динамически». Под динамическим я подразумеваю то, что вы не просто накладываете маску, линейно изменяя ее размер на 1 или 2 оси. Вы можете выбрать точку маски и изменить ее, я хочу это сделать, но моя маска - это мой вырезанный кусок, а точка - это часть этого фрагмента, который необходимо изменить, чтобы фрагмент соответствовал положению сгенерированных ориентиров. Я знаю, что об этом топи c очень сложно думать, и если вам нужны какие-либо разъяснения, просто спросите. Мой код:

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

EDIT: Нет, я не серийный убийца

1 Ответ

1 голос
/ 29 мая 2020

Если вам нужно деформировать исходное изображение, например, резиновый лист, используя 2 набора ключевых точек, вам нужно использовать шлиц тонкой пластины (TPS) или, лучше, двойное аффинное преобразование, например здесь . Последний больше похож на методы растеризации текстур (преобразование текстуры треугольник в треугольник).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...