我目前正在完成针对兴趣点探测器的评估工具。在最后的步骤中,我发现了一个令人困惑的错误。
Mat findHomography(InputArray srcPoints, InputArray dstPoints, int method=0, double ransacReprojThreshold=3, OutputArray mask=noArray() )
srcPoints
和dstPoints
是vector<Points2f>
,它存储匹配关键点的对应点。到目前为止没什么特别的 - 就像在教程中一样。
但是当我使用RANSAC并且在范围[0,...,4]中有vector<Points2f>
时,我得到的断言错误比计数器应该大于或等于4。
问题1:算法是否需要至少四个点来描述属于当前模型的内容并创建共识?
问题2:有没有关于此的文档? (我看了doc和tutorials。)
Please note that I already have seen this question。但是对于RANSAC的行为没有令人满意的答案。或者我应该接受这种方法至少需要四点才能找到单应性?
感谢您的帮助。
答案 0 :(得分:8)
不能用少于4对点来计算单应性。那是因为只有3分,存在视角模糊。画一个三角形
a
b c
图像中的1.在图像2中,点已经变换为看起来像这样
a
b c
b和c之间的距离减少了一半。不幸的是,你不知道是不是因为c点离你或离你越来越近了。第四点差异变得清晰。
a d
b c
这是图像1中的正方形
d
a
b c
这里d和c向你旋转
a
d
b c
在这里他们离开了你。
我在openCV文档中没有看到这个要求,但是如果你发现有关单应性计算的任何资源,你就不必在找到这个要求之前阅读很多,并且更严格地证明4点是足够的。
答案 1 :(得分:4)
RANSAC用于在更大的集合或对应中选择4对匹配点(即srcPoints.size() >= 4
时)。这就是srcPoints.size() <=4
。
您需要至少4个对应关系,因为Homography矩阵H
具有8个自由度,因此需要8个线性方程来找到解。由于每对点生成两个线性方程(使用x和y坐标),因此总共需要至少4个对应关系。