【发布时间】:2015-06-14 18:59:31
【问题描述】:
我在世界坐标中有一组 3d 点,并与图像中的 2d 点分别对应。我想找到一个矩阵,让我在这些点之间进行转换。如何在 OpenCV 中做到这一点?
【问题讨论】:
我在世界坐标中有一组 3d 点,并与图像中的 2d 点分别对应。我想找到一个矩阵,让我在这些点之间进行转换。如何在 OpenCV 中做到这一点?
【问题讨论】:
cv::solvePnP() 是您正在寻找的东西,它从 3D-2D 点对应关系中找到对象姿势并生成旋转向量 (rvec),与平移向量 (tvec) 一起,将点从模型坐标系到相机坐标系。
【讨论】:
您可以为此使用solvePnP:
// 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();
【讨论】: