OpenCV:为什么projectPoints()给我奇怪的结果?

4

为什么我的代码片段对于预测点给出了奇怪的结果?

//Generate the one 3D Point which i want to project onto 2D plane
vector<Point3d> points_3d;
points_3d.push_back(Point3d(10, 10, 100));
Mat points3d = Mat(points_3d);

//Generate the identity matrix and zero vector for rotation matrix and translation vector
Mat rvec = (Mat_<double>(3, 3) << (1, 0, 0, 0, 1, 0, 0, 0, 1));
Mat tvec = (Mat_<double>(3, 1) << (0, 0, 0));

//Generate a camera intrinsic matrix
Mat K = (Mat_<double>(3,3) 
<< (1000, 0, 50,
    0, 1000, 50,
    0, 0, 1));

//Project the 3D Point onto 2D plane
Mat points_2d;

projectPoints(points_3d, rvec, tvec, K, Mat(), points_2d);

//Output
cout << points_2d;

我得到了预期的二维点
points_2d = (-1.708699427820658e+024, -9.673395654445999e-026)

如果我自己在纸上计算,使用这个公式我期望得到一个点 points_2d = (150, 150):enter image description here

1个回答

1
添加 cv::Rodrigues(InputArray src, OutputArray dst, OutputArray jacobian=noArray())。OpenCV在计算中使用的是旋转向量而不是旋转矩阵。Rodrigues变换允许您将旋转向量转换为矩阵,也可以将矩阵转换为向量。下面我附上您的代码的一部分,并添加了一行代码。
//Generate the identity matrix and zero vector for rotation matrix and translation vector
Mat rvec,rMat = (Mat_<double>(3, 3) << (1, 0, 0, 0, 1, 0, 0, 0, 1));
Rodrigues(rMat,rvec); //here
Mat tvec = (Mat_<double>(3, 1) << (0, 0, 0));

它应该正常工作。定义畸变系数也将更好。

 Mat dist = Mat::zeros(8,1,CV_32f);

编辑:

还有一点要注意,在矩阵初始化时存在一些语法错误:

cv::Mat rvec,rMat = (cv::Mat_<double>(3, 3) << /* ( */1, 0, 0, 0, 1, 0, 0, 0, 1); //you had error here
cv::Rodrigues(rMat, rvec);
cv::Mat tvec = (cv::Mat_<double>(3, 1) <</* ( */ 0, 0, 0); //and here

在我电脑上更改后它可以正常工作。


1
请注意,您可以使用反引号(`)来包含语句以生成行内代码。例如,`this` 会生成 this - alkasm
它仍然给出一些奇怪的结果... points_2d = [-2.189252230068162, 2.108690908231197e-026] - Mirnyy
谢谢Kamil。矩阵初始化中的那个小语法错误就是问题所在! - Mirnyy
我还更改了您的K矩阵的初始化:cv :: Mat K2 =(cv :: Mat_ <double>(3,3)<< 1000,0,50,0,1000,50,0,0,1);,然后我得到了您想要的points_2d = [150, 150]。 - Artur

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接