2012-08-24 8 views
6

Ich habe eine planare Markierung, wo ich den SIFT Algorithmus ausgeführt habe, um Merkmale zu extrahieren. Dann führe ich einen Detektor aus, um diesen Marker in der Szene zu finden und Features wieder zu extrahieren. Ich passe die Punkte an und extrahiere die Homographie aus den gepaarten Paaren mit OpenCV unter Verwendung von findHomography().Projektion eines 2D-Punktes von einer Markierung zum Bild mit berechneter Homographie

Jetzt möchte ich die im Marker mit der berechneten Homographie erkannten 2D-Punkte projizieren, um die Positionen mit den aus der Szene gemessenen 3D-Punkten zu vergleichen und den Reprojektionsfehler zu berechnen. Ich bin verwirrt mit den Pixelkoordinaten, Zentimeter, Kalibrierungsmatrizen, ich weiß nicht, welche Konvertierungen ich zuerst machen soll.

Kennt jemand einen Link zu diesem oder kann die Methode erklären?

Antwort

6

Wenn Sie die Homographiematrix H aufrufen, wäre die Kameramatrix K (benötigt zum Konvertieren in Pixel) in etwa so, abhängig von Ihrer Auflösung.

Mat K= Mat::zeros(3,3,CV_32FC1); 
K.at<float>(0,0)=500.0f;   
K.at<float>(0,2)=320.0f;  // width/2  
K.at<float>(1,1)=500.0f;  
K.at<float>(1,2)=240.0f;  // height/2 
K.at<float>(2,2)=1.0f; 

Wenn Ihre Markierungspunkte sind Vektorpunkte von 2D:

vector<Point2f> marker_point; //containing coordinates in centimeters 

dann dem Vorsprung so sein würde, mit dem Ergebnis, ein 3D-Punkt in Pixelkoordinaten.

Mat point(3,1,CV_32FC1);   
point.at<float>(0) = marker_point.x; 
point.at<float>(1) = marker_point.y; 
point.at<float>(2) = 1.0f; 
point = H* point; 
point = point/point.at<float>(2);  //Normalize 
point = K* point;     //to pixels