迭代非线性最小二乘优化3d到2d投影
Iterative non-linear-least-squares opimizing a 3d to 2d projection
请原谅我的英语不好,这不是我的母语。
我试图解决一个非线性最小二乘问题。我有两组点。时间t的一组3d点和时间t+1的一组2d图像点,知道它们之间的对应关系。
现在我有了下面的等式:
x(t+1) = ( x(t) - y(t)*rotz + z(t)*roty + tx )*f/(-x(t)*roty + y(t)*rotx+z(t)+tz)
y(t+1) = ( x(t)*rotz + y(t) - z(t)*rotx + ty )*f/(-x(t)*roty + y(t)*rotx+z(t)+tz)
变量f为焦距。我想确定rotx, roty, rotz, tx, ty, tz,使计算点(t+1的图像点)与已知图像点(t+1)之间的残差最小。
取图像点之间的欧几里得距离作为误差测量。
E = sqrt( (x(t+1) - X)^2 + (y(t+1) - Y)^2 )
X和Y为已知的2d图像点。
我计算了一个矩阵a,每个点对应一行,列中有rox, roty等的偏导数。
我还用E的结果计算了列向量y,用于对rotx, roty等的第一次估计。
现在我可以计算变量的更新:
delta = inv(A' * A) * A' * y
(A'表示A的转置)在更新之后,我使用这些变量进行更多的迭代。
但算法不收敛,即使我设置第一个估计与期望解。所以我觉得我做错了什么。
我是否使用了错误的方法?谁能给我一个链接到一个很好的例子,或者可以解释他的方法来解决这个问题。
非常感谢!: -)
我的问题解决了。y向量的计算误差必须为负,否则算法不会收敛。
y(i) = -E(i)
相关文章:
- 如何声明一个可以在整个程序中使用的全局 2d 3d 4d .. 数组(堆版本)变量?
- 如何在 3D OpenGL 场景上绘制 SDL 2D 矩形?
- 根据组件 1、2(和 3)对空间 (2D/3D) 向量进行排序
- 删除使用 new 创建的 2D 或 3D 指针
- 将 3D 变换转换为 2D
- CUDA,使用2D和3D阵列
- 用于将笛卡尔 (x,y,z) 转换为圆柱坐标 (ρ,θ,z) 坐标 2D/3D 的代码
- 从 C++ 中的 3D 矩阵中提取 2D 矩阵
- 使用 pcl 或 opencv 在 2D 场景中匹配 3D 模型
- 将 2D 图像坐标转换为 z = 0 的 3D 世界坐标
- 将每个对象渲染到空间中,并在3D场景上渲染2D场景
- 使用 2D 数据创建 3D 直方图(OpenCV?
- 使用 OpenCV 在 3D 矩阵中导入 2D 矩阵
- 将 2D 屏幕坐标转换为 3D 世界坐标
- OpenCV从2D像素获取3D坐标
- 使用cuda的平行尺寸降低(3d至2d)
- 将2D数组的实例分配给3D数组中的索引
- OPENCV(C ) - 从已知的3D对象和相机位置计算图像的2D坐标
- 如何使用3D char数组调整双指针2D char阵列的大小
- 在单目视觉里程计中使用 3D-2D 运动估计的相机位置