Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

findEssentialMat returns [3x10] or [3x4] Mat

Hi, I tried to use 5 point algorithm to get camera pose. I need [3x3] essential matrix but the cv::findEssentialMat returns [3x30] or [3x12] Mat. The cv::decomposeEssentialMat requires [3x3] Mat so I can't test my code.

Below simple code gives the same 5 2D points to the findEssentialMat and I expected R = identity, and t = 0.

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int main(){

    vector<Point2f> first_2d_points, second_2d_points;

    for(int i = 0; i < 5; i++){
        first_2d_points.push_back(Point2f(i,i));
        second_2d_points.push_back(Point2f(i,i));
    }

    double focal_length = 600;
    Point2d pricipal_point = Point2d(320, 240);

    Mat essential_matrix = findEssentialMat(first_2d_points,
                        second_2d_points,
                        focal_length,
                        pricipal_point,
                        RANSAC,
                        0.99,
                        2.0);

    cout << essential_matrix.size() << endl;
    cout << essential_matrix << endl;

    cout << endl;

    Mat R1, R2, t;
    decomposeEssentialMat(essential_matrix, R1, R2, t);

    cout << R1 << endl;
    cout << R2 << endl;
    cout << t << endl;

    return 0;
}

This gives me [3x30] Mat as an essential matrix. Below simple code gives [3x12] Mat as an essential matrix.

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int main(){

    vector<Point2f> first_2d_points, second_2d_points;

    for(int i = 0; i < 5; i++){
        first_2d_points.push_back(Point2f(i,i));
        second_2d_points.push_back(Point2f(i+1,i));
    }

    double focal_length = 600;
    Point2d pricipal_point = Point2d(320, 240);

    Mat essential_matrix = findEssentialMat(first_2d_points,
                        second_2d_points,
                        focal_length,
                        pricipal_point,
                        RANSAC,
                        0.99,
                        2.0);

    cout << essential_matrix.size() << endl;
    cout << essential_matrix << endl;

    cout << endl;

    Mat R1, R2, t;
    decomposeEssentialMat(essential_matrix, R1, R2, t);

    cout << R1 << endl;
    cout << R2 << endl;
    cout << t << endl;

    return 0;
}

What should I do to get a [3x3] essential matrix?