【发布时间】:2014-10-23 18:19:56
【问题描述】:
我最近是 OpenCV 的新手,我一直在努力校准我的相机。经过几天的研究,我对它有了基本的了解。但是我仍然无法理解一些基本点。
1)objectpoint 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(real World)。我试过了 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坐标pixel = u = imagepoint?
网上有很多信息,但我没有找到100%可靠的来源
我已经没有什么选择了,如果有人能给我一个关于相机校准的很好的解释或指出我正确的方向(论文等),我真的很感激。
提前谢谢你
【问题讨论】:
标签: java opencv camera-calibration