2016-12-17 9 views
2

У меня есть два набора точек - скажите A и B, и оба имеют одинаковый размер. Я триангулирую каждый из этих множеств, используя триангуляцию Делоне в OpenCV с классом Subdiv2D. Точки в каждом наборе представляют черты лица каждого лица, и я пытаюсь пробовать текстуру в каждом треугольнике из множества A и деформировать ее на соответствующий треугольник из множества B. Фактически, это даст мне нечто вроде морфинга одного выражения лица в другое эффект (просто деформируя текстуры). К сожалению, оказывается, что когда я вызываю метод getTriangleList для множества A, а затем для множества B, треугольник A_i делает , а не, соответствует треугольнику B_i. Другими словами, порядок треугольников не совпадает с порядком, в котором точки были добавлены к каждому из множеств. Я на самом деле сделал очень простой тест, и я создал набор B как копию A и добавил постоянное значение к координате x каждой точки в B, эффективно перемещая каждую точку в B вправо. После триангуляции порядок был сломан снова. Есть ли способ отслеживать, на каком треугольнике это? Без этого я не могу правильно деформироваться из одной формы в другую (если не существует другого способа сделать это)Соответствующие результаты триангуляции Delaunay в OpenCV

ответ

0

Вопрос, который я задал выше, просто не имеет ответа, потому что нет гарантии, что два подобных набора (A и B) с тем же номером, значением и порядком точек будут иметь одинаковую топологию после каждого из них обрабатывается триангуляцией Делоне. Другими словами, если 3 точки от A_0 до A_2 образуют треугольник в A, точки B_0-B_2 необязательно должны создавать треугольник в B (они могут принадлежать двум или более различным треугольникам).

Решение, которое я нашел, чтобы создать карту M (triangleId, pointIds), которое коррелируется треугольник идентификатор из A с vertexIds, принадлежащих к этой triangleId из A. Далее, я не триангуляции B вообще - поскольку точечный порядок и значение в B - это то же самое, что и в A, я могу применить карту M к B, а также для триангуляции B точно так же, поддерживая топологию. После этого проблема просто исчезает. Это, очевидно, не гарантирует, что B будет правильно триангулироваться в соответствии с правилом Делоне, однако он решает мою проблему.