OpenCV中的Haar+Adaboost(四):利用并查集合并检测窗口(NMS)
来源:互联网 发布:端口拦截 编辑:程序博客网 时间:2024/05/21 14:55
1 并查集(Union-Set)
图2 江湖大侠关系图(箭头表示上一级)
缩进如图2,现在武当和明教分别推举张三丰和张无忌为老大。当帮派很大时,每个大侠记不住帮派所有人,那么他们只需要记住自己的上一级是谁,一级一级往上问就知道老大是谁了。某日,宋青书和殷梨亭在武当山门遇到,那么宋青书问宋远桥后得知自己的老大是张三丰,而殷梨亭的老大也是张三丰,那么他俩是同门。反之宋青书遇到陈友谅时,一级一级向上询问后发现老大不是一个人,就不是同门。
缩进除此之外,在武林中还需要组建联盟扩大帮派势力。既然杨不悔嫁给了殷梨亭,不妨直接设张无忌的上级为张三丰,这样就可以将明教和武当组成一个更大的联盟(如图2红色虚线。需要说明,我们只关心数据的代表,而忽略数据内部结构)。从此以后当宋青书再和杨不悔相遇,一级一级查询后可以确定是同伙了。但是如果大侠们相遇都像这样一级一级往上问,查询路径很长。所以这种直接连接最上级的方法不是最优。
缩进为了解决这个问题,需要压缩路径——每个人记住自己最终的老大就行(如宋青书记住自己老大是张三丰,不在去问宋远桥),基本思路如下:
1.以武当为例,张三丰创建门派(明教也类似)
2.宋远桥和殷梨亭加入武当派,上级设置为张三丰
3.宋青书通过与宋远桥的关系加入武当派,压缩路径后设置上级为张三丰,同时也设置其所有原上级的上级为张三丰(由于原上级宋远桥的上级就是张三丰,没有变化)。
缩进压缩完路径后的武当与明教状态图如下,其中红色代表压缩路径:
4.杨不悔通过与殷梨亭的关系也加入武当派别,压缩路径后设置上级为张三丰,同时设置原上级张无忌的上级是张三丰。绿色代表此次压缩路径。
缩进以后每次在合并中关系到了谁,就压缩谁的路径,同时压缩谁的所有上级的路径。此后宋青书和杨不悔的查询路径就短了很多。
5.假如某天范右使收徒了,徒弟也要加入联盟。在加入的时候,也需要压缩路径,设置徒弟的上级为张三丰;同时设置徒弟的原上级(范右使和张无忌)的上级为张三丰,如蓝色箭头。由于张无忌的上级就是张三丰,所以没有改变。这样,范右使的路径也得到压缩。
缩进看完例子之后,一起来看看并查集定义。并查集保持一组不相交的动态集合S={S1,S2,...,Sk},每个动态集合Si通过一个代表ai来识别,代表是集合中的某个元素(ai∈Si)。在某些应用中,哪一个元素被选为代表是无所谓的,我们只关心在不修改动态集合的前提下分别寻找某一集合的代表2次获得的结果相同;在另外一些应用中,如何选择集合的代表可能存在预先说明的规则,如选择集合的最大or最小值作为代表。总之,在并查集中,不改变动态集合S则每个集合Si的代表ai不变。
2 利用并查集合并检测结果窗口
定义好窗口相似性函数后,就可以利用并查集合并窗口函数了,大致过程如下:
- 首先利用MAKE-SET函数建立Rect对象的并查集初始结构
- 然后遍历整个并查集,用SimilarRects::operator()判断每2个窗口相似性,若相似则将这2个窗口合并为“一伙人”;
- 运行完步骤2后应该出现几个相互间不相似的窗口“团伙”,当“团伙”中的窗口数量小于阈值minNeighbors时,丢弃该“团伙”(认为这是零散分布的误检);
- 之后剩下若干组由大量重叠窗口组成的大“团伙”,分别求每个“团伙”中的所有窗口位置的平均值作为最终检测结果。
-------------------------------------------
参考文献:
[1] Thomas H.Cormen、Charles E.Leiserson等.《算法导论》
[2] http://blog.csdn.net/dellaserss/article/details/7724401
欢迎在下面的评论区留言提问or交流,私信不回。
下一篇,我会逐步开始介绍opencv_traincasacde.exe的训练原理。
- OpenCV中的Haar+Adaboost(四):利用并查集合并检测窗口(NMS)
- 【人脸检测】OpenCV中的Haar+Adaboost级联分类器分解(四):利用并查集合并检测结果窗口
- Haar+Adaboost级联分类器分解(三):利用并查集合并检测结果窗口
- 【人脸检测】OpenCV中的Haar+Adaboost级联分类器分解(一):Haar特征介绍
- OpenCV中的Haar+Adaboost(一):Haar特征详细介绍
- OpenCV中的Haar+Adaboost(一):Haar特征详细介绍
- OpenCV中的Haar+Adaboost(六):minHitRate与maxFalseAlarm
- OpenCV中的Haar+Adaboost(七):分类器训练过程
- OpenCV中的Haar+Adaboost(六):minHitRate与maxFalseAlarm
- OpenCV中的Haar+Adaboost(七):分类器训练过程
- OpenCV自带的adaboost程序训练并检测目标
- OpenCV:OpenCV目标检测Adaboost+haar源代码分析
- OpenCV中的Haar+Adaboost(五):AdaBoost之DAB与GAB
- OpenCV中的Haar+Adaboost(五):AdaBoost之DAB与GAB
- OpenCV中的Haar+Adaboost(五):AdaBoost之DAB与GAB
- Adaboost+Haar+Opencv博客
- opencv实现自己训练的Adaboost(Haar-like)检测识别库
- 利用Adaboost和Haar特征进行人脸检测
- Team them up! UVA
- 根号法、埃氏法、欧拉筛选。三种方法求素数
- 用OpenCV的VideoWriter类进行视频写/输出操作!
- 更直观的查看ctype中字符检查函数
- 学不会设计是因为你忽略了这90%的内容
- OpenCV中的Haar+Adaboost(四):利用并查集合并检测窗口(NMS)
- Part 1: 如何把Power BI 嵌入到sharepoint 网站
- 如何将一个已存在的目录转换为一个 GIT 项目并托管到 GITHUB 仓库
- opencv 将Mat转为图片数据
- qduoj 帅气的HYC的珍珠(前缀和+思维)
- 信号量Semaphore的基本使用
- OpenCV中的Haar+Adaboost(五):AdaBoost之DAB与GAB
- 智能新时代-不一样的人机交互体验
- opencv line 绘制直线