estimateRigidTransform

estimateRigidTransform

阅读了几篇有关将2D点从一幅图像到另一幅图像进行2D转换的文章之后,estimateRigidTransform()似乎是推荐的方法。我正在尝试使用它。我修改了源代码(更改RANSAC参数,因为它是硬编码的,并且硬编码的参数不是很好)(此函数的源代码在lkpyramid.cpp中)。我已经阅读了RANSAC的工作原理,并试图理解estimateRigidTransform()中的步骤。

// choose random 3 non-complanar points from A & B
...
// additional check for non-complanar vectors
a[0] = pA[idx[0]];
a[1] = pA[idx[1]];
a[2] = pA[idx[2]];

b[0] = pB[idx[0]];
b[1] = pB[idx[1]];
b[2] = pB[idx[2]];

double dax1 = a[1].x - a[0].x, day1 = a[1].y - a[0].y;
double dax2 = a[2].x - a[0].x, day2 = a[2].y - a[0].y;
double dbx1 = b[1].x - b[0].x, dby1 = b[1].y - b[0].y;
double dbx2 = b[2].x - b[0].x, dby2 = b[2].y - b[0].y;
const double eps = 0.01;

if( fabs(dax1*day2 - day1*dax2) < eps*std::sqrt(dax1*dax1+day1*day1)*std::sqrt(dax2*dax2+day2*day2) ||
    fabs(dbx1*dby2 - dby1*dbx2) < eps*std::sqrt(dbx1*dbx1+dby1*dby1)*std::sqrt(dbx2*dbx2+dby2*dby2) )
    continue;

使用非共面 vector 是错字吗?我是说2D点都在同一平面上吗?

我的第二个问题是if条件在做什么?我知道如果点是共线的,则左侧(将三角形的面积乘以2)将为零或接近零,而右侧是三角形2个边的长度的乘积。

最佳答案

共线性保留在仿射变换中(例如您可能正在估计的变换),但是此变换还可以计算视角的旋转变化(就像您在3D世界中旋转对象一样)。但是,这些点也将是共线的,因此对于算法而言,它可能没有唯一的解决方案。看图片:

c&#43;&#43; - OpenCV EstimateRigidTransform()-LMLPHP

想象在第一张图像的第一行中选择每个黑色正方形的3个中心点。然后将其映射到下一张图像中的相同中心。它可以生成到该解决方案的映射,但也可以生成到第一个解决方案的缩放版本的映射。第三个版本可能会发生相同的情况,只是这次可能映射到第一个版本的缩小版本(没有任何其他更改)。但是,如果这些点不是共线的,例如3个角正方形中心,则会找到唯一的映射。

我希望这可以帮助您澄清疑问。如果没有,请发表评论

09-08 05:31