我最近是OpenCV的新手,我一直在努力校准我的相机。经过几天的研究,我对它有了基本的了解。但我仍然无法理解一些基本观点。
1)对象点Matrix的初始化,为什么要在0,0
中初始化这个矩阵Mat a = new MatOfPoint3f();
for(int y=0; y<SIZE_Y; ++y)
{
for(int x=0; x<SIZE_X; ++x)
{
points = new MatOfPoint3f(new Point3(x*distance_Board , y*distance_Board , 0));
a.push_back(points);
}
}
在电路板处于3D世界的位置初始化它会更有意义吗
Mat a = new MatOfPoint3f();
for(int y=1; y<=SIZE_Y; ++y)
{
for(int x=1; x<=SIZE_X; ++x)
{
points = new MatOfPoint3f(new Point3(x*distance_Board + FirstPoint.x, y*distance_Board + FirstPoint.y, 0));
a.push_back(points);
}
}
2)
我尝试使用
校准我的相机 Calib3d.calibrateCamera(object_points, corners, gray.size(), cameraMatrix, distCoeffs, rvecs, tvecs);
我尝试了超过15张图片,但结果仍然很差,因为我不了解为图像设置rvec和tvec的重要性(我理解逻辑,因为对于每个点旋转和翻译是不同的)但它如何帮助我们与其他点/其他图像。我认为校准为我们提供了一个很好的方法,可以将3d点转换成整个场景中的2d点。
这就是我跑步的原因
Calib3d.projectPoints(objectPoints, rvecs.get(i), tvecs.get(i), cameraMatrix, distCoeffs, imagePoints);
我真的不知道选择哪种rvecs和tvecs
3)
是否有从2D(imagePoints)转换为3D(真实世界)的方法。我试过了 this但由于校准参数不正确,结果不正确
4)
我也尝试过从2D到3D的翻译,如下所示
x ̃ = x * ( 1 + k1 * r^2 + k2 * r^4 ) + [ 2 p1 * x * y + p2 * ( r^2 + 2 * x^2 ) ]
y ̃ = y * ( 1 + k1 * r^2 + k2 * r^4 ] + [ 2 p2 * x * y + p2 * ( r^2 + 2 * y^2 ) ],
a)但是什么是r? r = sqrt(x ^ 2 + y ^ 2)?并且x =(x坐标像素) - (相机中心像素)?
b)摄像机中心是否为像素= cx =摄像机矩阵的参数?
c)x坐标像素= u = imagepoint?
网上有很多信息,但我没有找到100%可靠的来源
我的选项已经用完了,如果有人能给我一个很好的解释相机校准或指向正确的方向(论文等),我真的会感到沮丧。
提前谢谢
答案 0 :(得分:1)
答案 1 :(得分:0)
我不知道您是否已经使用opnecv校准解决了问题,但无论如何我会给你一些提示。首先,我建议你阅读有关校准的张论文(http://research.microsoft.com/en-us/um/people/zhang/Papers/TR98-71.pdf)。 Opencv方法基于Zhang的工作,因此理解它是一个真正的优先事项。 校准相机意味着确定相机2D坐标系(以像素为单位,相机图像的左上角的原点)与外部世界的3D坐标系(例如,以米为单位)之间的关系。当您将已知的平面校准对象放置在摄像机前时,系统应计算knonw 3D对象与2D图像之间的均匀变换(即“rvecs.get(i),tvecs.get(i) “你在谈论。 图像坐标始终为像素,内在校准矩阵也以像素表示。 您无法从2D图像坐标“平移”到3D世界坐标,但您可以计算正确的变换:它由内部校准矩阵和旋转平移矩阵组成。另请参阅本文http://research.microsoft.com/en-us/um/people/zhang/Papers/Camera%20Calibration%20-%20book%20chapter.pdf 希望这有帮助!