opencv - 3D刚性变换的组合

标签 opencv image-processing computer-vision motion-detection

这个问题属于主题 - 'Structure from Motion'。

假设有 3 张图片。图像1-2和图像2-3之间有点对应关系,但是图像1和图像3之间没有共同点。我得到了图像2的RT(旋转和平移矩阵),RT12,相对于图像1(考虑图像1 RT 为 [I|0],即旋转为恒等式,平移为零)。让我们将 RT12 拆分为 R12 和 T12。

同样,我得到 RT23,将图像 2 RT 视为 [I|0]。所以,现在我有 R23 和 T23,它们与图像 2 相关,但与图像 1 无关。现在我想找到 R13 和 T13。

对于合成数据集,方程 R13=R23*R12 给出了正确的 R(已验证,因为我实际上已经预先计算了 R13)。类似的T13应该是T2+T1。但是以这种方式计算的翻译是不好的。因为我有实际结果,所以我可以验证旋转估计得很好,但不是平移。有什么想法吗?

最佳答案

这是一个简单的矩阵 block 乘法问题,但您必须记住,您实际上考虑的是 4x4 矩阵(与 3D 齐次世界中的刚性变换相关联)而不是 3x4 矩阵。

您的 3x4 RT 矩阵实际上对应于 4x4 矩阵 A 的前三行,其最后一行是 [0, 0, 0, 1]:

RT23 -> A23=[R23, T23; 0, 0, 0, 1]

RT12 -> A12=[R12, T12; 0, 0, 0, 1]

然后,如果您对 4x4 矩阵 (A13 = A23 * A12) 进行矩阵 block 乘法,您很快就会发现:

R13 = R23 * R12

T13 = R23 * T12 + T23

关于opencv - 3D刚性变换的组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23750498/

相关文章:

.net - 如何在图表控件中显示EMGU直方图?

c++ - 如何获得连续两帧的平均输出?

c++ - 加载、裁剪和保存 jpg C++

python - 对同色像素 block 的边界进行着色

image-processing - DCT 对 -128 到 +127 之间的像素值进行运算

opencv - OpenCV中的共轭旋转变换

c++ - 快速像素访问 opencv

python - 和有什么区别!和 !!在 yaml 中?

python - 如何在 OpenCV Haar 分类器中显示最大的矩形

opencv - 将 arm_compute::Image 转换为 cv::Mat