1

我正在使用 opencv 来估计两个图像之间的仿射变换(我们称之为 A 和 B,我想从 A 估计到 B),我需要实现 RANSAC 以获得可能的最佳估计。到目前为止,我的 RANSAC 框架(考虑到我已经有了两个图像的关键点以及它们之间的匹配):

1:选择3个随机匹配,将A和B的匹配点作为getAffineTransform函数的输入;

2:使用函数warpAffine对A的点进行warp,并将结果与​​B的点进行比较,得到异常值率:e;

3:考虑到我的样本大小是 3 个点(getAffineTransform 需要 3 个点才能找到变换),并且我有异常值 e 的比率,我可以找到我需要运行 RANSAC 的次数才能找到一个很高的概率好的估计,是N次;

4:重新运行第 1 步和第 2 步 N 次,保持具有最小异常值率的变换;

虽然基本的想法似乎很好,但我在执行时遇到了一些问题,特别是第 2 步。我的问题是,我不确定如何测试异常值的数量。我考虑过使用 warpAffine 将 A 的点映射到 B,但我几乎可以肯定它不会起作用,因为我相信该函数会解释我的点垫(这是一个 Mx2 垫,M 是点数,每个将点的坐标 x 和 y 列为图像,而不是我要映射的一组点。我怎样才能做到这一点?

我正在使用带有 c++ 的 opencv 2.4.2。

4

2 回答 2

0

回答我自己的问题,我实际上找到了一种方法。我不确定这是不是最好的方法,但根据我到目前为止所做的测试,它似乎工作正常。

正如这里所解释的

http://docs.opencv.org/doc/tutorials/imgproc/imgtrans/warp_affine/warp_affine.html#warp-affine

仿射变换是一种可以表示为矩阵相乘的变换。因此,应用转换只需将我的点乘以从 getAffineTransform 获得的矩阵。在映射单个点之前,我们需要在要映射的点上附加一个“1”并将其转置(因此我们有列向量),然后通过将其乘以变换矩阵进行映射。如果我们将 Mx2 点矩阵转换为以下形式的 3xM 点矩阵,我们可以轻松地为每个点扩展此映射:

|x1, x2, x3, ...., xM|
|y1, y2, y3, ...., yM|
| 1,  1,  1, ....,  1|

并乘以变换矩阵!稍后我可能会使用一个简单的测试程序来编辑这篇文章,以展示它是如何工作的。

此外,为了附加这个向量并转置它,我正在执行以下操作:

1 - Create a new 3 x M matrix consisting of ones with Mat::ones, named newPtMat
2 - transpose my original point matrix, and keep it in a temp Mat
3 - use temp.copyTo(newPtMat.rowRange(0, 2)

我不确定这是最有效的方法,所以如果有人有更好的建议,请发表评论!

于 2012-09-08T20:20:53.253 回答
0

有一个名为“findTransformsECC”的新功能可用于查找两张图片之间的仿射变换扭曲矩阵,http ://docs.opencv.org/3.0-beta/modules/video/doc/motion_analysis_and_object_tracking.html#findtransformecc

我认为它在 Opencv 3.0 + 中可用

于 2016-09-02T11:43:48.243 回答