gpt4 book ai didi

c++ - OpenCV 估计刚体变换()

转载 作者:行者123 更新时间:2023-11-28 05:06:23 24 4
gpt4 key购买 nike

在阅读了几篇关于将 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)将为零或接近零,而右侧是三角形两条边的长度的乘积。

最佳答案

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

test

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

希望本文能帮助您解开疑惑。如果没有,请发表评论

关于c++ - OpenCV 估计刚体变换(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44645244/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com