1.特征点检测与匹配

1.特征点检测与匹配,第1张

三维模型重建的流程:

三维点云获取——几何结构恢复——场景绘制

三维点云获取:

1.激光雷达

2.微软Kinect

有效距离比较短

3.单目多视角 :几乎很难实时

4.双目立体视觉

基于图像的三维模型重建:

1.输入图像

2.基于图像的点云生成

3.点云到模型的重建

4.纹理图像的创建与编辑

5.纹理模型

相关商业软件:

Acute3D,Altizure,Agisoft PhotoScan

图像特征点应用:

1.相机标定

2.图像拼接

3.稠密重建

4.场景理解

图像特征点的检测方法:

图像特征点的基本要求:

1.差异性——可检测

特征点应该呈现出区别于非特征点的明显特征

2.重复性——可匹配

对应同一三维点的特征点应该在不同视角中被重复检测到

动机:特征点具有局部差异性

图像梯度

Harris矩阵

Harris矩阵H的特征值分析:

矩阵特征值反应了两个垂直方向的变化情况,一个事变化最快的方向,一个事变化最慢的方向

行列式值为特征值相乘,行列式的迹为特征值相加

在特征点附近,其他点的响应也比较大。

所以选取局部响应最大值,避免重复检测

算法流程

Harris角点检测一般用于快速检测,比如视频里面的跟踪

动机:Harris角点检测不具有尺度不变性

LoG算子:Lindeberg(1993)提出Laplacian of Gaussian

(LoG)函数的极值点对应着特征点

Lindeberg(1993)提出Laplacian of Gaussian

(LoG)函数的极值点对应着特征点

尺度空间:

对于一幅图像,用不同大小的滤波核进行滤波,一般用高斯滤波,得到一系列图像,这些图像就称之为尺度空间。然后把这些图像摞起来

LoG特征检测效果好,但是计算量比较大。

工程中也很少用。为了更好地利用LoG的性质,提出了一种近似的算法:基于DoG的特征检测子

LoG可以由DoG近似:

Lowe(2004)提出LoG近似等价于相邻尺度的高斯差分(DoG)

高斯空间:

高斯差分(DoG)

上图为3个Octive,每个octive的尺寸都会减小一半。

上图每个Octive中,左侧为高斯空间,相邻高斯空间做差得到DoG空间

特征点检测为在三维空间上做一个极值的比较,(三维空间为图像的二维空间+尺度的空间),必须需要两个方向有极值。在高斯差分,边界上的两层是无效的,只有中间的红色区域是有效的。

在Octive,

if 每阶有效差分数 S =3,则高斯空间层数为N = S+3

特征点位置确定:

在位置和尺度空间组成的三维空间中寻找极值点

亚像素特征点位置确定:

除去边缘点:

DoG在边缘处值较大,需要避免检测到边缘点

通过统计梯度直方图的方法确定主方向,使算法具有旋转不变性

旋转 不变性、 尺度 不变性 、亮度 变化 不变性 ,对视角变化、 仿射 变换有一定程度的稳性

SIFT特征点非常稳定和鲁棒,但是计算量很大,对于要求稳定的图像建模可以采用。

针对实时要求比较高的应用提出了快速特征检测。

FAST特征点(Feature from Accelerated Segment Test)

通过检测局部像素灰度变化来确认特征点的位置

速度快,SIFT的一百倍,不具有尺度和旋转不变性

基于直方图的描述子

基于不变性的描述子

二进制描述子

以特征点为中心取一块区域,有圆形或者矩形,称之为特征支持区域

主方向:进行旋转并重新插值

特征尺度:影响支持区域的大小

用于微小运动的描述子

以特征点为中心的矩形区域内所有

像素的灰度值作为描述子,拉成一个向量,计算向量间距离

适用于微小变化的图像

对图像存在明显的旋转、尺度、光照和透视变换时不稳定

根据主方向对支持区域进行旋转,并通过双线性插值重构

减去均值再除以方差

图像归一化处理,去除光照变化

描述子形式:

描述向量由N个0或者1组成

N= 128,256,512

生成速度快,匹配效率高,不具有旋转不变性

最近邻搜索

最近邻距离比(lowe-ratio)

最近邻距离和次近邻距离比小于一定值

快速最近邻搜索

哈希表

多维Kd-tree

BFM(Bruce Force Mather)匹配ORB的结果

错误的匹配可以通过估计相机模型方式去除

估计 Homography Homography 矩阵之前最好的 50 对匹配对

1.Kinect原理:

kinect1:Prime Sense公司的Light Coding技术作为原理,给不可见光打码,然后检测打码后的光束,判断物体的方位。

kinect2:TOF原理(精度、灵敏度和分辨率都更高),根据光反射回来的时间判断物体的方位,当然检测光的飞行速度是几乎不能实现的,所以发射一道强弱随时间变化的正弦光束,然后计算其回来的相位差值,所以使用场景尽量避免反射物以及不要移动Kinect,不然会有问题。

2.可供研究开源库:Openni,KinectSDK,手势库NITE,Kinect-ms-sdk。由于我是新手,而且比较熟悉的Kinect的SDK,所以就从这个开始总结,其他的有机会再来详细分析。

3.首先你用Kinect,首先要了解它能干什么,能获得哪些数据

其实看他的SDK就知道它能获取的数据包括:语音,彩色图像,深度图像,骨骼数据(这个是根据深度和彩色通过算法识别提供给开发者使用的)。而又这几种数据又能扩展出什么新的数据,开发出什么有趣的功能完全是由开发者们的能力和对世界的好奇。(官方SDK已提供了表情,脸部建模,语音识别,手势判断等,其他的估计不会那么快提供出来)

4.Kinect的使用程序流程:

开始程序-获取kinect摄像机-打开读取器-打开Kinect-获取读取器的相关帧数据-使用帧数据-关闭帧-关闭读取器-关闭Kinect-关闭程序

这就是Kinect的一个完整的工作流程,无论是彩色,深度,骨骼的数据获取都需要这个流程的,而我们主要 *** 作是在使用帧数据的这个阶段。其他基本是不变的。

4.1 kinect的开启很简单:在程序开始时,也就是unity的Start函数里写下

_Sensor = KinectSensor.GetDefault()

if (_Sensor != null)

{

_Reader = _Sensor.ColorFrameSource.OpenReader()

if (!_Sensor.IsOpen)

{

_Sensor.Open()

}

}

这样就能成功开启Kinect传感器和读取器了。

4.2 程序的关闭

要注意的是没获取完数据不要随意进行Kinect的关闭 *** 作,不然数据会不准确,一般kinect的关闭是在你准备要关闭程序的时候进行的,在unity上的mono类里有专门的OnApplicationQuit(),在这里进行关闭kinect的 *** 作。

代码如下:

void OnApplicationQuit()

{

if (_Reader != null)

{

_Reader.Dispose()

_Reader = null

}

if (_Sensor != null)

{

if (_Sensor.IsOpen)

{

_Sensor.Close()

}

_Sensor = null

}

}

中间的数据获取和数据的使用会占很大的篇幅,会在后续的博客里一个个分析


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12027533.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存