Linemod;理解
Linemod 代码笔记
2019年03月11日 16:18:30 haithink 阅读数:197
最近了解到 Linemod 这个模板匹配算法,印象不错
准备仔细学习一下,先做点代码笔记,免得后面不好回顾
目前的笔记基本上把 核心流程都分析得比较清楚了,除了一些阈值的选取
opencv 的contrib 模块有这个算法的实现
我看的代码来自这里
https://github.com/meiqua/shape_based_matching
先大概记录下 代码思路:
分两个阶段, train 和 test
Train
Train 中 , shapeInfo_producer 负责用来对 模板进行 各种旋转和尺度缩放,
shapes.src_of 可以根据旋转和尺度 生成变换后的 模板
对每一个模板 执行 detector.addTemplate 操作,
最后调用 shapes.save_infos 和 detector.writeClasses 这两个保存训练 结果。保存的信息用于 后续的匹配中。
- shapes.save_infos 保存 的信息是 每张图片是 原始图像经过哪种旋转和缩放得到的
- detector.writeClasses 则 保存 每个模板 的信息,包括cropTemplates(tp) 后的高宽和坐标、 特征点坐标信息,特征点的label 就是梯度方向
=============================================================================
Detector::addTemplate
1 modality->process(source, object_mask)
然后就是 对梯度幅值 超过一定阈值的 像素点 的 3*3 邻域 求 梯度直方图
投票数 超过 阈值的 方向 作为最终的 量化方向
至此, modality->process 完成
返回 一个 Ptr qp
然后 开始遍历金字塔每一层, 如果不是最底层, 那么 qp 降采样,并且 做梯度量化操作, 即调用上面的 update()
这一步是 提取第 L 层特征点, 保存在 tp[l]中。 细节参考后文
说明: tp是个vector, 每个 元素都是一个模板,对应金字塔某一层提取出来的特征点
这个函数 先 遍历每一个 模板, 找出特征点最大最小坐标,注意,高层次的金字塔图像的坐标会进行放大(根据层次)
得到 4个最小、最大坐标。 注意: 是所有层共用信息
返回 Rect(min_x, min_y, max_x - min_x, max_y - min_y)
但 外部并未接收 这个返回值
Magnitude 是 之前 quantizedOrientations 中计算出的梯度幅值(梯度平方和)
遍历完后,如果 candidates 个数低于阈值, 返回 false, 此次 抽取失败。。。
Test
shape_based_matching::shapeInfo_producer::load_infos
每张图片是 原始图像经过哪种旋转和缩放得到的
auto matches = detector.match(img, 90, ids);
90 是阈值, ids 是 训练时 指定的id字符串 test
然后 modality->process(source, mask),
这个调用在前面已经介绍过了,会 构造一个 ColorGradientPyramid 对象,对source图像计算量化后的梯度信息
=============================================================================
Detector::matchClass
static void spread(const Mat &src, Mat &dst, int T)
static void computeResponseMaps
(const Mat &src, std::vector &response_maps)
这个数组, 上交这个学生 对原来的值 进行了修改: 1,2–>0 3–>1
为什么这么改?
https://zhuanlan.zhihu.com/p/35683990
这篇文章给出了 修改的解释
static void linearize
(const Mat &response_map, Mat &linearized, int T)
这个是改变存储方式,先行后列, 间隔T 读取,然后写入。没有比较复杂和特殊的处理。
similarity_64
实际上, 只比较模板上提取的特征点, 以及 模板 覆盖在 输入图像上某个位置时, 这些模板特征点对应到 输入图像上的像素点 之间的梯度差异。
代码当中用 template_positions 表示 模板的当前滑动位置。
计算similarity map最直观的方法是:对每个模板位置, 找出所有特征点在输入图像上对应的像素, 计算所有梯度方向的相似性,累加。 然后 处理下一个模板位置。
Linemod;理解相关推荐
- 理解Linemod匹配算法
理解Linemod匹配算法 Linemod算法是一种基于形状的模板匹配算法,相较于历史工作,该算法通过量化梯度角度方法,利用现代计算机SIMD技术,实现更为快速的匹配.可以认为Linemod的主要工作 ...
- linemod算法过程理解
一.提取模板 1.预处理 使用高斯模糊预处理将要作为模板的RGB图 2.模板梯度计算 分别计算RGB三个通道中每个像素点x和y方向的梯度(sobel算子),取幅值最大的作为该像素的梯度,若梯度幅度值小 ...
- LineMod模板匹配算法的原理与实现 (原理及公式)
点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 背景介绍 LineMod算法是由Hinterstoisser等人在2011年提出的旨在解决杂乱场景下少 ...
- LineMod源码梳理
LineMod算法 代码来源:https://github.com/meiqua/shape_based_matching 一.总体结构说明 1.Feature结构体描述了一个特征点,即(x,y)位置 ...
- 通用解题法——回溯算法(理解+练习)
积累算法经验,积累解题方法--回溯算法,你必须要掌握的解题方法! 什么是回溯算法呢? 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就&quo ...
- stream流对象的理解及使用
我的理解:用stream流式处理数据,将数据用一个一个方法去 . (点,即调用) 得到新的数据结果,可以一步达成. 有多种方式生成 Stream Source: 从 Collection 和数组 Co ...
- Linux shell 学习笔记(11)— 理解输入和输出(标准输入、输出、错误以及临时重定向和永久重定向)
1. 理解输入和输出 1.1 标准文件描述符 Linux 系统将每个对象当作文件处理.这包括输入和输出进程.Linux 用文件描述符(file descriptor)来标识每个文件对象.文件描述符是一 ...
- java局部变量全局变量,实例变量的理解
java局部变量全局变量,实例变量的理解 局部变量 可以理解为写在方法中的变量. public class Variable {//类变量static String name = "小明&q ...
- 智能文档理解:通用文档预训练模型
预训练模型到底是什么,它是如何被应用在产品里,未来又有哪些机会和挑战? 预训练模型把迁移学习很好地用起来了,让我们感到眼前一亮.这和小孩子读书一样,一开始语文.数学.化学都学,读书.网上游戏等,在脑子 ...
最新文章
- MySQL优化—工欲善其事,必先利其器之EXPLAIN
- 从基础设施到云原生应用,全方位解读阿里云原生新锐开源项目
- 期待已久的2012年度最佳 jQuery 插件揭晓
- JSP简单练习-页面重定向
- 随笔分类 - java高级特性
- Python 的AES加密与解密
- C语言高级编程:函数指针的用法
- Leetcode--94. 二叉树的中序遍历(迭代递归)
- 【Matlab】滤波器常用命令
- 倒计时 3 天!1024 程序员节全日程曝光,105 场深度演讲点燃数字经济新时代
- linux杀掉80端口线程命令
- eclipse 完全智能提示
- 泥塑课c语言,【C】泥塑课(From http://www.jisuanke.com/)
- 随想录(cmake编译)
- 【HASH】【UVA 10125】 Sumset
- DeBank和非小号网站的数据分析-实习工作小结
- VINS-Mono 代码解析二、初始化 第3部分
- 最佳学习方法(10)学习方法介绍
- Android HIDL 介绍学习之客户端调用
- 星起航:抖音小店如何提升店铺复购率