OpenCV代码精妙之三 实现点集元素之间最小距离
来源:互联网 发布:mac双系统文件共享 编辑:程序博客网 时间:2024/06/18 17:09
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
- OpenCV代码精妙之三 实现点集元素之间最小距离
- OpenCV代码精妙之一 四叉树实现点集均匀分布
- c#代码实现根据经纬度获取2点之间距离
- 点到直线的距离opencv实现
- ACM2001Java实现两个点之间的距离
- OpenCV代码精妙之二 巧妙避免大量if
- Opencv源码之平面点集的最小包围圆
- PHP计算2点经纬度之间的距离代码
- PHP计算2点经纬度之间的距离代码
- 平面上点对的最小距离算法-java实现
- 题意:给10^5个点的坐标,求出最小的两个点之间的距离
- 图论之遍历所有点的最小距离
- 最小编辑距离代码
- 两个经纬度点之间的距离各个版本实现
- python实现两个经纬度点之间的距离和方位角
- 平面4点最小距离
- hdu 1007 分治法求最小点之间的距离(使用分治法模板)
- 算法代码实现之选出第k小元素、中位数、最小的k个元素(线性复杂度),Java实现
- 阙值,阈值,阀值,傻傻分不清
- 解决PKIX:unable to find valid certification path to requested target 的问题
- java web请求url获取json数据获取value值
- C++学习-STL容器
- 应用级联CNN的人脸检测--笔记
- OpenCV代码精妙之三 实现点集元素之间最小距离
- java中从键盘输入的三种方法
- 频率论学派(传统数理统计学)和贝叶斯统计学比较
- nyoj88汉诺塔一(快速幂)
- The study of slice in Python(20170911)
- openwrt 编译遇到的问题
- setInterval()定时器只执行一次的解决
- Hrbust-1815 小乐乐大逃亡(最长递增子序列)
- JDK1.7 hashMap的简单实现