我正在使用opencv来估计两个图像之间的仿射变换(我们称之为A和B,我想从A到B估计),我需要实现RANSAC以获得最佳估计。到目前为止,我的RANSAC框架(考虑到我已经拥有了图像和它们之间匹配的关键点):
1:选择3个随机匹配,并使用A和B中的匹配点作为函数getAffineTransform的输入;
2:使用函数warpAffine来扭曲A中的点,并将结果与B的点进行比较,得到异常值的比率:e;
3:考虑到我的样本大小为3分(getAffineTransform需要3分才能找到变换)并且我有异常值e,我可以找到运行RANSAC的概率很高的概率找到一个好的估计,这是N次;
4:重新运行步骤1和2 N次以保持变换具有最小的离群率;
虽然基本的想法看起来很好,但我在执行方面遇到了一些麻烦,特别是第2步。我的问题是,我不确定如何测试异常值的数量。我想过用warpAffine将A点映射到B,但是我几乎可以肯定它不会起作用,因为我相信函数会解释我的点数(这是一个Mx2 Mat,M是点数,每个将点的坐标x和y列作为图像,而不是我想要映射的一组点。我怎么能这样做?
我正在使用opencv 2.4.2和c ++。
答案 0 :(得分: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)
我不确定这是最有效的方式,所以如果有人有更好的建议,请发表评论!
答案 1 :(得分:0)
我有一个名为“findTransformsECC”的新函数可以在两张图片之间找到仿射变换warp-matrix http://docs.opencv.org/3.0-beta/modules/video/doc/motion_analysis_and_object_tracking.html#findtransformecc
我认为它在Opencv 3.0 +中可用