OpenCV代码精妙之三 实现点集元素之间最小距离

OpenCV代码精妙之三 实现点集元素之间最小距离

goodFeaturesToTrack 可传入一个参数 表示 返回的特征点像素距离需要 高于 该参数指定的值
具体如何实现的呢

首先 goodFeaturesToTrack 返回的 特征点 是具有 所谓 强度 的,类似于 得分
得分越高, 越优先保留

在该基础之上, 如果某两个特征点 距离低于 了 参数 指定阈值,
那么 其中 得分较低 的将被 剔除

最简单的做法是,遍历所有特征点,
检查其他特征点 与该特征点的距离 是否低于阈值,如果低于,那么删除 这些特征点

该做法 时间复杂度 O(n*n)

OpenCV 的实现的核心 思想了 利用了一个二维数组,
该二维数组 实际上是 将 图像 分成了 N * N的网格
网格的高宽即为 距离阈值,
数组中每一个元素 是一个动态数组, 包含了坐标位于 该网格内的 所有特征点的坐标

std::vector<std::vector<Point2f> > grid(grid_width*grid_height);

注意,std::vector<Point2f>即为 数组内每一个元素
grid 可理解为 一个对应到 图像像素平面 的二维数组, 两个维度大小分别为 grid_width, grid_height

然后 遍历 每一个特征点,
获取 所在网格, 然后 遍历 位于 该网格 以及 其 八连通 邻域内的特征点,
比较 其 距离是否 低于 距离阈值 即可
为什么 是 八连通 邻域呢?
如下图 所示, 即可得出该结论。即, 低于距离阈值的特征点 一定位于 该网格 以及 其 八连通 邻域内
八连通示意

const int grid_width = (w + cell_size - 1) / cell_size; 

这种除法都是为了向上取整,比如 w为100, cell_size 为10, 那么10个cell 刚刚就够了
但w 为91, cell_size 为10, 此时也需要 10个cell

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值