gpt4 book ai didi

opencv - 如果我在 estimateRigidTransform 或 getAffineTransform 中提供更多输入会怎样?

转载 作者:太空宇宙 更新时间:2023-11-03 20:50:20 24 4
gpt4 key购买 nike

我将 estimateRigidTransform 与大约两个 100 点的向量一起使用,并且工作正常。但不知何故 getAffineTransform 不起作用。

我知道 findHomography 使用 RANSAC 找到最佳矩阵,而 getPerspectiveTransform 只需要 4 个点。

我的问题是,如果我在 estimateRigidTransform 或 getAffineTransform 中提供更多输入,会发生什么情况?

输入矩阵是否只需要 4 个点?或者做某种 RANSAC?

最佳答案

您提到的功能可以分为 3 种不同的类型:

类型 1:getAffineTransform 和 getPerspectiveTransform。给定一个平面上的 3 个点和另一个平面上的 3 个匹配点,您可以计算这些平面之间的仿射变换。给定 4 个点,你可以找到透视变换。这就是 getAffineTransform 和 getPerspectiveTransform 所能做的:它们需要 3 对和 4 对点,不多不少,并计算相关的变换。唯一的。

类型 2:estimateRigidTransform。如果你不能绝对精确地得到你的点(当你从图像中得到它们时通常是这种情况)那么你需要超过 3 对点来减少错误。越多越好(即准确度更高)。有不止一种方法可以定义您想要减少的错误,以及您使用什么方法来找到最小错误。 estimateRigidTransform 正在最小化最小二乘误差(我认为是最流行的误差定义)。它通过求解方程组来做到这一点。如果您正好提供 3 个点,那么结果当然与 getAffineTransform 的结果相同。如果 estimateRigidTransform 可以完成它的工作,你可以问为什么我们在 OpenCV 中需要 getAffineTransform。 las,这不是 OpenCV 中唯一的冗余。

类型 3:findHomography。这个更高级。它不仅可以处理点位置的错误,还可以处理异常值的存在。如果点之间存在一些错误匹配,那么将它们用于最小二乘误差估计将导致非常糟糕的准确性。它可以使用 RANSAC 或 LMeD 来测试可能的匹配并消除那些异常值。它的工作方式类似于 estimateRigidTransform 的多次迭代:为不同的点子集找到最小二乘匹配。如果您知道不存在异常值,那么您可以将“方法”参数设置为 0,它将像 estimateRigidTransform 一样工作 - 通过尝试最小化由所有点的匹配产生的最小二乘误差。

编辑。感谢 Micka 的评论。

我想我的内存在捉弄我。我记得 estimateRigidTransform 是在 OpenCV 中通过方程组实现的,但现在我检查了一下,发现 Micka 是对的。它确实在其中使用了一些硬编码的 RANSAC……抱歉误导了您。

对于那些仍然对封闭形式的解决方案而不是 RANSAC 感兴趣的人,这里是:

// find affine transformation between two pointsets (use least square matching)
static bool computeAffine(const vector<Point2d> &srcPoints, const vector<Point2d> &dstPoints, Mat &transf)
{
// sanity check
if ((srcPoints.size() < 3) || (srcPoints.size() != dstPoints.size()))
return false;

// container for output
transf.create(2, 3, CV_64F);

// fill the matrices
const int n = (int)srcPoints.size(), m = 3;
Mat A(n,m,CV_64F), xc(n,1,CV_64F), yc(n,1,CV_64F);
for(int i=0; i<n; i++)
{
double x = srcPoints[i].x, y = srcPoints[i].y;
double rowI[m] = {x, y, 1};
Mat(1,m,CV_64F,rowI).copyTo(A.row(i));
xc.at<double>(i,0) = dstPoints[i].x;
yc.at<double>(i,0) = dstPoints[i].y;
}

// solve linear equations (for x and for y)
Mat aTa, resX, resY;
mulTransposed(A, aTa, true);
solve(aTa, A.t()*xc, resX, DECOMP_CHOLESKY);
solve(aTa, A.t()*yc, resY, DECOMP_CHOLESKY);

// store result
memcpy(transf.ptr<double>(0), resX.data, m*sizeof(double));
memcpy(transf.ptr<double>(1), resY.data, m*sizeof(double));

return true;
}

关于opencv - 如果我在 estimateRigidTransform 或 getAffineTransform 中提供更多输入会怎样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25375597/

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