manatttta
manatttta

Reputation: 3124

How to find correspondence of 3d points and 2d points

I have a set of 3d points in world coordinates and respective correspondences with 2d points in an image. I want to find a matrix that gives me the transformation between these set of points. How can I do this in OpenCV?

Upvotes: 1

Views: 1705

Answers (2)

berak
berak

Reputation: 39796

you can use solvePnP for this:

    // camMatrix based on img size
    int max_d = std::max(img.rows,img.cols);
    Mat camMatrix = (Mat_<double>(3,3) <<
        max_d,   0, img.cols/2.0,
        0,   max_d, img.rows/2.0,
        0,   0,     1.0);

    // 2d -> 3d correspondence
    vector<Point2d> pts2d = ...
    vector<Point3d> pts3d = ...
    Mat rvec,tvec;
    solvePnP(pts3d, pts2d, camMatrix, Mat(1,4,CV_64F,0.0), rvec, tvec, false, SOLVEPNP_EPNP);
    // get 3d rot mat
    Mat rotM(3, 3, CV_64F);
    Rodrigues(rvec, rotM);

    // push tvec to transposed Mat
    Mat rotMT = rotM.t();
    rotMT.push_back(tvec.reshape(1, 1));

    // transpose back, and multiply
    return camMatrix * rotMT.t();

Upvotes: 0

Kornel
Kornel

Reputation: 5354

cv::solvePnP() is what you are looking for, it finds an object pose from 3D-2D point correspondences and results a rotation vector (rvec), that, together with translation vector (tvec), brings points from the model coordinate system to the camera coordinate system.

Upvotes: 2

Related Questions