我发展,我现在用的SIFT + RANSAC和单应找到一个对象(OpenCV的C ++,JAVA)的应用程序。 我现在面临的问题是,那里有许多异常RANSAC表现不佳。
对于这个原因,我想尝试什么SIFT的作者说是相当不错的:投票。
我已阅读,我们应该在4维特征空间,其中4个维度的投票:
虽然与OpenCV中很容易拿到赛scale
和orientation
有:
cv::Keypoints.octave
cv::Keypoints.angle
我有很难理解我怎么能计算出位置。
我发现了一个有趣的幻灯片 ,其中只有one match
,我们能够得出一个边界框:
但我不明白我怎么能绘制边框只有一个匹配。 任何帮助吗?
你正在寻找的最大集合的适合从图像1到图像2.几何变换。在这种情况下匹配的特征,它是相似变换,其具有4个参数:翻译(dx, dy)
比例改变ds
,和旋转d_theta
。
比方说,你已经匹配功能:从图像1和F2 F1从图像2.设(x1,y1)
是F1的图像1的位置,让s1
是其规模,并让theta1
是它的方向。 同样,你有(x2,y2)
s2
,以及theta2
为F2。
两个特征之间的转换是(dx,dy) = (x2-x1, y2-y1)
两个特征之间的比例改变为ds = s2 / s1
。
两个特征之间的旋转是d_theta = theta2 - theta1
。
因此, dx
, dy
, ds
,和d_theta
是你的霍夫空间的尺寸。 每个区间对应于相似变换。
一旦你执行霍夫投票,发现最大窗口,该箱子让你从图像1到图像的变换2.有一件事你可以做的是将影像1的边框,并使用该改造改造它:适用相应的翻译,旋转和缩放的图像的角上。 通常情况下,你包的参数为变换矩阵,并使用齐次坐标。 这会给你的图像2与您已经检测到物体的边界框。
当使用Hough变换,您创建签名存储每个功能的位移矢量从模板心(无论是(w/2,h/2)
或中心矩的帮助)。
例如,用于在模板上发现10个SIFT特征,根据模板的质心的相对位置是一个vector<{a,b}>
现在,让我们来搜索该对象在查询图像:查询图像中找到的每个SIFT特征,与模板的10的一个匹配,投下一票到其相应的质心。
votemap(feature.x - a*, feature.y - b*)+=1
其中a,b对应于该特定的特征向量。
如果其中的一些功能在同一地点(集群是必要的)成功投,你已经找到一个对象实例。
签名和投票是相反的过程。 假设V=(-20,-10)
因此,新的图像中搜索过程中,当发现的两场比赛中,我们发现他们的方向和大小,并铸有相应的投票。 例如,用于右框形心将是V'=(+20*0.5*cos(-10),+10*0.5*sin(-10))
从SIFT特征远,因为它是在半尺寸和-10旋转度。
为了完成迪马的,需要补充的是,图4D霍夫空间被量化为一个(可能是小的)数目的4D盒,其中每个盒对应于由它的中心给出的simiéarity。
然后,用于经由特征的暂定匹配获得的每个可能的相似性,加入1到四维空间中的对应的框(或小区 )。 输出相似度是通过与更票单元中给出。
为了computethe从1场变换,只是用迪马的公式在他的回答。 对于几双的比赛,你可能需要使用一些最小二乘法拟合。
最后,该变换可以用函数被应用于cv::warpPerspective()
其中,所述立体矩阵的第三行设置为[0,0,1]