Bagaimana cara menghitung pose kamera dari matriks Homografi?

13

Katakanlah saya hanya menggunakan satu kamera yang dikalibrasi. Dari kamera ini, saya mendapatkan gambar A dan B. Saya tahu homografi antara A dan B, yang dihitung melalui OpenCV 's findHomography () .

Saya tahu pose (rotasi matriks R dan terjemahan vektor t) dari gambar A, dan saya membutuhkan pose gambar B. Setelah saya mendapatkannya, saya kira saya akan dapat menghitung setiap pose lebih lanjut dari gambar berikut.

Apakah Anda tahu implementasi pose komputasi B? Saya menemukan beberapa artikel di web, tetapi saya tidak dapat menemukan solusi yang mudah diimplementasikan ...

Stéphane Péchard
sumber
Saya tidak yakin bahwa saya mengerti cara menggunakan kode Anda. Saya menggunakan OpenCV untuk mengambil Homografi, tetapi ketika saya mengirim Homografi melalui algoritma, selalu mengembalikan ini. cameraPose [1, 0, 0, 0; 0, 1, 0, 0; 0, 0, 1, 0]
LeRoss

Jawaban:

7

Bahkan jika jawaban saya terlambat untuk Anda, mungkin orang lain menganggap ini berguna. Saya memiliki kode untuk Pose openCV dari Homografi. Saya menemukan metode di situs web yang sangat berguna ini, 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
sumber
Saya telah menggunakan fungsi Anda dalam kode saya. Matriks pos yang dihitung menggunakan cara ini selalu [1 0 0 0; 0 1 0 0; 0 0 1 0; 0 0 0 0]. Apakah Anda punya penjelasan?
Muhammet Ali Asan
Apakah Anda menggunakan pose A? Tampaknya Anda hanya menggunakan input H
Guig
Metode ini tidak benar-benar akurat, bahkan dengan matriks homografi yang dihitung langsung dari pose yang diketahui. Namun, hasilnya dapat ditingkatkan, menggunakan proses berulang di mana Anda mendapatkan matriks dari perkiraan pose, membalikkannya, dan menerapkannya ke input asli. Dapatkan parameter pose dari homografi residu ini, perbarui perkiraan pose Anda, dan seterusnya hingga konvergen.
dividebyzero
3

Saya menemukan implementasi yang bagus, menggunakan OpenCV: http://nghiaho.com/?p=1298

Stéphane Péchard
sumber
0

Anda dapat menggunakan metode dekomposisi Homografi yang diterapkan di Opencv 3.0+

decomposeHomographyMat

  • Fungsi Opencv mengembalikan seperangkat kemungkinan rotasi, normals kamera dan matriks terjemahan.
  • Anda harus memilih set yang benar di antara mereka dengan membandingkan normal kamera dengan kamera normal kamera ketika gambar pertama diambil
nbsrujan
sumber