我最近在OpenCV中是新手,我一直在努力校准我的摄像机。经过几天的研究,我对它有了一个基本的了解。但我仍然不明白一些基本观点。摄像机校准OpenCV
1)objectpoint矩阵的初始化,我们为什么初始化这个矩阵中的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)
我试图使用校准
我的相机我试过超过15张图片,但结果仍然很差,因为我不明白有一个rvec和tvec为非常形象的意义(我理解逻辑,因为每一个点的旋转和翻译是不同的),但它如何帮助我们与其他点/其他图像。我认为校准为我们提供了一个公平的好方法,在整个场景转换的三维点到二维点..
这就是为什么当我运行
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) ],
一)但是,什么是R' r = sqrt(x^2 + y^2)?和x =(x坐标像素) - (以像素为单位的相机中心)?
b)摄像机的中心是像素= cx =摄像机矩阵的参数吗?
c)x坐标像素= u =像点?
有大量的信息在网上,但我还没有找到一个100%可靠的来源
我已经走投无路,我真的apreciate如果有人可以给我的相机校准或点的一个很好的解释我走向正确的方向(论文等)。
预先感谢您