2016-12-17 85 views
2

我有兩組點 - 說A和B,兩者都是相同的大小。我使用Subdiv2D類的OpenCV中的Delaunay三角剖分對這些集合中的每一個進行三角剖分。每個集合中的點代表每個臉部的臉部特徵,我試圖從集合A中的每個三角形內抽取紋理,並將它翹曲到集合B中相應的三角形。實際上,這會給我一種將一個臉部表情變形爲另一個效果(只是通過扭曲紋理)。不幸的是,事實證明,當我爲set A調用getTriangleList方法,然後爲set B調用三角形A_i時,而不是對應於三角形B_i。換句話說,三角形的順序與點被添加到每個集合的順序是不一樣的。我實際上做了一個非常簡單的測試,我創建了B作爲A的副本,並將常量值添加到B中每個點的x座標,從而有效地將B中的每個點移到右側。在三角測量之後,訂單再次被打破。有什麼方法可以跟蹤哪個三角形是哪個?不這樣做,我無法正確地從一種形狀彎曲到anohter(除非有一些其他的方式來做到這一點)在OpenCV中Delaunay三角剖分的匹配結果

回答

0

我問上面簡單的問題沒有答案,因爲沒有保證兩個相似集(一個B)具有相同的數量,點的含義和順序在它們中的每一個用Delaunay三角測量處理之後將具有相同的拓撲。換句話說,如果A點中的3個點A_0到A_2形成一個三角形,則點B_0到B_2不必在B中形成一個三角形(它們可以屬於兩個或更多不同的三角形)。

我發現的解決方案是創建一個地圖M(triangleId,點名)與屬於從A.接着該triangleId vertexIds相關三角形ID,我不三角在所有 - 由於B中的點順序和含義與A中的相同,因此我可以將地圖M應用於B以便以完全相同的方式對B進行三角測量,從而保持拓撲結構。之後,問題就會消失。這顯然不能確保B按照Delaunay規則進行適當的三角剖分,但它解決了我的問題。

相關問題