2012-10-10 13 views
5

Ich habe die Form eines Gesichts mit zusammen mit der Rekonstruktion dieses Gesichts und ich möchte das entsprechende Bild der ursprünglichen Form modellieren.OpenCV - geeignete Implementierung für Thin - Plate Spline Warping

Grundsätzlich möchte ich die Punkte von der ursprünglichen Form zu der Position bewegen, die durch die Rekonstruktion des Gesichts angezeigt wird. Ich habe versucht, dies zu tun, indem Sie dünne Platte Spline Warping, diese Implementierung davon verwenden: http://ipwithopencv.blogspot.ro/2010/01/thin-plate-spline-example.html.

Allerdings funktioniert es nicht so, wie ich es möchte. Ich möchte die Ecken des Bildes fixieren und nur die entsprechenden Punkte verschieben, die das Gesicht definieren. Ich kann das mit 2 Bildern illustrieren. Im ersten Bild habe ich die Form des ursprünglichen Gesichtes mit der rekonstruierten Form. enter image description here

Hier habe ich das Bild, das ich ändern möchte und das resultierende Bild mit dem Code aus dem oben genannten Link. Die grünen Punkte markieren die ursprünglichen Gesichtspunkte und die blauen Punkte markieren ihre neue Position und wo ich sie neu positionieren und mein Gesicht strecken möchte.

enter image description here

Alles, was ich will, ist nur die grünen Punkte auf die blauen Punkte zu bewegen, so dass sie deformiert aussieht. Kennen Sie eine Methode, die Sie getestet haben?

Antwort

1

Die Ecken reparieren ist ziemlich einfach. Fügen Sie einfach vier zusätzliche Korrespondenzen für die vier Bildecken hinzu. In Bezug auf Ihr Beispiel:

iP.push_back(cv::Point(0, 0)); 
iiP.push_back(cv::Point(0, 0)); 
iP.push_back(cv::Point(0, height-1)); 
iiP.push_back(cv::Point(0, height-1)); 
iP.push_back(cv::Point(width-1, 0)); 
iiP.push_back(cv::Point(width-1, 0)); 
iP.push_back(cv::Point(width-1, height-1)); 
iiP.push_back(cv::Point(width-1, height-1)); 

Wo, natürlich, Breite ist die Bildbreite und Höhe ist die Bildhöhe