Wie berechnet man die Kamerapose aus der Homografiematrix?

13

Angenommen, ich verwende nur eine kalibrierte Kamera. Von dieser Kamera, erhalte ich Bilder A und B. Ich kenne die Homografie zwischen A und B, berechnet durch OpenCV ‚s findHomography () .

Ich kenne die Pose (Rotationsmatrix R und Translationsvektor t) von Bild A und benötige die Pose von Bild B. Sobald ich sie erhalte, kann ich wahrscheinlich jede weitere Pose der folgenden Bilder berechnen.

Kennen Sie eine Implementierung von Computing B's Pose? Ich habe mehrere Artikel im Internet gefunden, aber ich konnte keine leicht umsetzbare Lösung finden ...

Stéphane Péchard
quelle
Ich bin mir nicht sicher, wie ich Ihren Code verwenden soll. Ich verwende OpenCV, um die Homographie abzurufen, aber wenn ich diese Homographie durch den Algorithmus sende, gibt es diese immer zurück. cameraPose [1, 0, 0, 0; 0, 1, 0, 0; 0, 0, 1, 0]
LeRoss

Antworten:

7

Auch wenn meine Antwort für Sie zu spät kommt, finden das andere vielleicht nützlich. Ich habe die Codes für eine openCV-Pose von Homography. Ich fand die Methode auf dieser wirklich nützlichen Website, euclideanspace .

void cameraPoseFromHomography(const Mat& H, Mat& pose)
{
    pose = Mat::eye(3, 4, CV_64FC1); //3x4 matrix
    float norm1 = (float)norm(H.col(0)); 
    float norm2 = (float)norm(H.col(1));
    float tnorm = (norm1 + norm2) / 2.0f;

    Mat v1 = H.col(0);
    Mat v2 = pose.col(0);

    cv::normalize(v1, v2); // Normalize the rotation

    v1 = H.col(1);
    v2 = pose.col(1);

    cv::normalize(v1, v2);

    v1 = pose.col(0);
    v2 = pose.col(1);

    Mat v3 = v1.cross(v2);  //Computes the cross-product of v1 and v2
    Mat c2 = pose.col(2);
    v3.copyTo(c2);      

    pose.col(3) = H.col(2) / tnorm; //vector t [R|t]
}

////

Jav_Rock
quelle
Ich habe Ihre Funktion in meinem Code verwendet. Die auf diese Weise berechnete Positionsmatrix ist immer [1 0 0 0; 0 1 0 0; 0 0 1 0; 0 0 0 0]. Hast du eine Erklärung?
Muhammet Ali Asan
Benutzt du die Pose von A? Es scheint, dass Sie nur die Eingabe H
Guig
3

Ich habe eine nette Implementierung mit OpenCV gefunden: http://nghiaho.com/?p=1298

Stéphane Péchard
quelle
0

Sie können die in Opencv 3.0+ implementierte Homografie-Zerlegungsmethode verwenden

decomposeHomographyMat

  • Die Opencv-Funktion gibt eine Reihe möglicher Rotationen, Kameranormalen und Translationsmatrizen zurück.
  • Sie müssen die richtige Einstellung auswählen, indem Sie die Kameranormalen mit den Kameranormalen der Kamera vergleichen, als das erste Bild aufgenommen wurde
nbsrujan
quelle