再谈AR中的图像识别算法
之前在《浅谈移动平台创新玩法》简单的猜测了easyar中使用的图像识别算法,基于图片指纹的哈希算法的图片检索 。后再阿里引商大神的指点下,意识到图片检测只适用于静态图片的识别,只能做AR脱卡(不进行图像追踪),简单地说就是如果图片有角度翻转,光线明暗的变化都会改变图片自身的指纹哈希值,无法做到跟踪识别。那要如何进行跟踪识别呢?
引商的指点:我们用的是akaze,整个匹配流程采用的是基于特征提取加kmeans树求近似最近邻匹配的算法,然后再对匹配到的关键点对求单应性映射,最后根据inlier点集进行打分的方式来最终判定识别到的目标。
图像特征
和图像指纹类似,能够唯一标示,区别于其他图像的“有趣部分”。一个很抽象的概念,它的精确定义往往由具体问题或应用类型来决定。可重复检测性是图像特征最重要的特性:同一图像无论发生角度,位移,明暗变化,所提取的特征应该是相同的。图像特征是许多计算机图像分析算法的起点,因此一个算法是否成功往往由它使用和定义的特征决定。
常用的图像特征有颜色特征,纹理特征,形状特征,空间关系特征。
颜色特征,是一种全局特征,描述了图像或图像区域所对应景物的表面性质。例如灰度直方图等。
纹理特征,是一种全局特征,描述了图像或图像区域所对应景物的表面性质。例如基于共生矩阵的熵、角二阶矩和局部平稳性等。
形状特征,是一种局部特征,描述了局部区域内物体的外形性质。例如边界特征等。
空间关系特征,是指图像中分割出来的多个目标之间的相互的空间位置或相对方向关系。这些关系也可分为连接/邻接关系、交叠/重复关系和包含/包容关系等。
特征被检测后它可以从图像中被提取出来。这个过程可能需要许多图像处理的计算(如大名鼎鼎的计算机视觉图像处理库OpenCV)。其结果被称为特征描述或者特征向量。
AKAZE特征提取算法
KAZE是 Pablo F. Alcantarilla,Adrien Bartoli和Andrew J. Davison2012年在ECCV2012[ECCV是计算机视觉领域最顶尖的三个会议(CVPR、 ECCV, ICCV)之一,每两年一次]中提出来的一种比SIFT、SURF(OpenCV 2.4.9版本中实现的图像特征检测算法)更稳定、性能更好的特征检测算法。
KAZE特征检测是在图像域中进行非线性扩散处理的过程。KAZE算法的作者提出采用加性算子分裂算法(Additive Operator Splitting, AOS)来进行非线性扩散滤波,可以采用任意步长来构造稳定的非线性尺度空间。
AKAZE 是加速版KAZE特征,即Accelerated KAZE Features。作者基于OpenCV实现了Akaze算法的代码,在项目主页(http://www.robesafe.com/personal/pablo.alcantarilla/kaze.html)可以下载到完整的实现源代码,具体使用中可以下载OpenCV 3.0及以上版本直接调用Akaze算法类(http://docs.opencv.org/3.0-beta/doc/tutorials/features2d/akaze_matching/akaze_matching.html)。
K-Meas算法
在数据挖掘中,K-Means 算法是一种聚类分析的算法。K-Means聚类的目的是:把n个点(可以是样本的一次观察或一个实例)划分到k个聚类中,使得每个点都属于离他最近的均值(此即聚类中心)对应的聚类,以之作为聚类的标准。
K-Means算法主要解决的问题:我们可以看到,在图的左边有一些点,我们用肉眼可以看出来有四个点群,但是我们怎么通过计算机程序找出这几个点群来呢?于是就出现了我们的K-Means算法。
例如在互联网金融公司的借贷业务中,给你1000000个用户,需要按金融产品种类分成n个人群,每一群人都有各自的“突出特征”(类似图像特征),以便区分出来他们都能适用哪一类产品,帮助金融公司合理规避借贷风险,这就是互联网金融公司基于大数据分析风控系统的基本原理。
这么解释K-Means算法是不是就容易理解多了。
单应性
单应性是几何中的一个概念,是一个从实射影平面到射影平面的可逆变换,直线在该变换下仍映射为直线。具有相同意义的词还包括直射变换、射影变换和射影性等。在计算机视觉领域中,空间中同一平面的任意两幅图像可以通过单应性关联在一起。比如一个物体可以通过旋转相机镜头获取两张不同的照片(这两张照片的内容不一定要完全对应,部分对应即可),我们可以把单应性设为一个二维矩阵M,那么照片1乘以M就是照片2。这有着很多实际应用,比如图像校正、图像对齐或两幅图像之间的相机运动计算(旋转和平移)等。
在数学里齐次坐标,或投影坐标是指一个用于投影几何里的坐标系统,如同用于欧氏几何里的笛卡儿坐标一样。如果点Q到成像仪上的点q的映射使用齐次坐标,这种映射可以用矩阵相乘的方式表示。若有一下定义:
则可以将单应性简单的表示为:
这里引入参数s,它是任意尺度的比例(目的是使得单应性定义到该尺度比例)。H有两部分组成:用于定位观察的物体平面的物理变换和使用摄像机内参数矩阵的投影。
物理变换部分是与观测到的图像平面相关的部分旋转R和部分平移t的影响之和,表示如下:
这里R为3*3大小的矩阵,t表示一个3维的列矢量,摄像机内参数矩阵用M表示,那么我们重写单应性如下:
单应性研究的是一个平面上到另外一个平面的映射,那么上述公式中的Q,就可以简化为平面坐标中的Q',即我们使Z=0。即物体平面上的点我们用x,y表示,相机平面上的点,我们也是用二维点表示。我们去掉了Z方向的坐标,那么相对于旋转矩阵R,R可以分解为R=[r1 r2 r3],那么r3也就不要了,参考下面的推导:
其中H为:
是一个3×3大小的矩阵,故最终的单应性矩阵可表示如下:
OpenCV就是利用上述公式来计算单应性矩阵。它使用同一物体的多个图像来计算每个视场的旋转和平移,同时也计算摄像机的内参数。
inlier点集验证
K-Means算法解决了图像特征聚类分析的问题,现在需要解决验证的问题 。OpenCV中有很多种匹配算法SIFT、ORB、RANSAC等算法,这里只说比较有名的RANSAC算法。RANSAC算法是一种简单且有效的去除噪声影响,估计模型的一种方法。与普通的去噪算法不同,RANSAC算法是使用尽可能少的点来估计模型参数,然后尽可能的扩大得到的模型参数的影响范围。
RANSAC算法的具体描述是:给定N个数据点组成的集合P,假设集合中大多数的点都是可以通过一个模型来产生的,且最少通过n个点(n<N)可以拟合出模型的参数,则可以通过以下的迭代方式拟合该参数。
对下面的操作执行k次:
(1)从P中随机选择n个数据点;
(2)用这n个数据点拟合出一个模型M;
(3)对P中剩余的数据点,计算每个点与模型M的距离,距离超过阈值的则认定为局外点(及outlier点),不超过阈值的认定为局内点(及inlier点),并记录该模型M所对应的局内点的值m;
迭代k次以后,选择m最大的模型M作为拟合的结果。
因为在实际应用中N的值通常会很大,那么从其中任选n个数据点的组合就会很大,如果对所有组合都进行上面的操作运算量就会很大,因此对于k的选择就很重要。通常情况下,只要保证模型估计需要的n个点都是点的概率足够高即可。因此设w为N个数据中局内点的比例,z为进行k次选取后,至少有一次选取的n个点都是局内点的概率。则有
其中 1−wn 表示一次选取不都是局内点的概率,(1−wn)k 表示k次选取中没有一次都是局内点的概率。 则有:
这里z一般要求满足大于95%即可。
至此一个完整的AR识别追踪流程原理分析完毕,后续就是OpenCV源码研究。
再谈AR中的图像识别算法的更多相关文章
- Unity教程之再谈Unity中的优化技术
这是从 Unity教程之再谈Unity中的优化技术 这篇文章里提取出来的一部分,这篇文章让我学到了挺多可能我应该知道却还没知道的知识,写的挺好的 优化几何体 这一步主要是为了针对性能瓶颈中的”顶点 ...
- 再谈机器学习中的归一化方法(Normalization Method)
机器学习.数据挖掘工作中,数据前期准备.数据预处理过程.特征提取等几个步骤几乎要花费数据工程师一半的工作时间.同时,数据预处理的效果也直接影响了后续模型能否有效的工作.然而,目前的大部分学术研究主要集 ...
- 再谈vim中多窗口的编辑
参考:http://blog.csdn.net/shuangde800/article/details/11430659 很好 鼠标在各个窗口间循环移动: ctrl+w+(小写的 hjkl), &qu ...
- 再谈c++中的引用
在<从汇编看c++的引用和指针>一文中,虽然谈到了引用,但是只是为了将两者进行比较.这里将对引用做进一步的分析. 1 引用的实现方式 在介绍有关引用的c++书中,很多都说引用只是其引用变量 ...
- NET Core微服务之路:再谈分布式系统中一致性问题分析
前言 一致性:很多时候表现在IT系统中,通常在分布式系统中,必须(或最终)为多个节点的数据保持一致.世间万物,也有存在相同的特征或相似,比如儿时的双胞胎,一批工厂流水线的产品,当然,我们不去讨论非IT ...
- 再谈vim中多窗口的编辑 ctrl+w+H窗口位置最大化和互换等操作
参考:http://blog.csdn.net/shuangde800/article/details/11430659 很好 鼠标在各个窗口间循环移动: ctrl+w+(小写的 hjkl), &qu ...
- 浅谈PHP5中垃圾回收算法
原文链接:http://www.cnblogs.com/leoo2sk/archive/2011/02/27/php-gc.html PHP是一门托管型语言,在PHP编程中程序员不需要手工处理内存资源 ...
- 再谈Contacts中姓氏多音字排序错误问题
说到中国人的名字,那就不得不考虑多音字的问题,比如'单',在作为姓氏时应该读作'shan'而不是'dan'.但是在Contacts程序中却使用的是'D'来作为bucket label!这是为什么?如何 ...
- JVM系列之:再谈java中的safepoint
目录 safepoint是什么 safepoint的例子 线程什么时候会进入safepoint safepoint是怎么工作的 总结 safepoint是什么 java程序里面有很多很多的java线程 ...
随机推荐
- [记录] 解决img的1px空白问题
第一种解决方案:把img变成块元素:display:block: 第二种解决方案:修改一下它的垂直对齐方式:vertical-align:middle: 第三种解决方案:使用浮动,让他漂浮起来:flo ...
- 笔记本移动位置,切换网络ip后,虚拟机的mac系统无法联网解决
1.手动配置新的ip
- TCP连接异常断开检测(转)
TCP是一种面向连接的协议,连接的建立和断开需要通过收发相应的分节来实现.某些时候,由于网络的故障或是一方主机的突然崩溃而另一方无法检测到,以致始终保持着不存在的连接.下面介绍一种方法来检测这种异常断 ...
- 使用pt-table-checksum及pt-table-sync校验复制一致性
一.简介 pt-table-checksum是percona-toolkit系列工具中的一个, 可以用来检测主. 从数据库中数据的一致性.其原理是在主库上运行, 对同步的表进行checksum, 记录 ...
- Java IO流学习总结六:ByteArrayInputStream、ByteArrayOutputStream
类的继承关系 InputStream |__ ByteArrayInputStream OutputStream |__ ByteArrayOutputStream ByteArrayInputStr ...
- 使用rgba设置输入框背景透明
项目中遇到要求输入框的背景设置透明度,但文字不受影响,如下图 输入框使用input标签 <input ref="searchText" type="search&q ...
- Python下HttpHTTPClient和AsyncHTTPClient
HTTPClient 使用例子: from tornado.httpclient import HTTPClient def synchronous_fetch(url): http_client = ...
- python java scala 单例模式
Python class Single2(object): """ 同一个对象 """ __instance = None def __ne ...
- Struct2.0学习笔记1
为了更好的配合队友写项目 现在学习如下 1.目录 2. 3. Struct2-Action 配置环境 4. 改action 名字 不用重启服务器(从上面粘贴) 改成true 即开发模式 5.想看源码 ...
- 学JS的心路历程-函式(二)arguments
参数(argument)与函式参数(parameter) 在讨论函式时,很多人都会把这两个搞混,我自己也不例外. 虽然讲错别人也听得懂,但是我们还是要搞清楚这两个的定义到底是什么! 参数是当我们呼叫函 ...