三维点云获取——几何结构恢复——场景绘制
三维点云获取:
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
}
}
中间的数据获取和数据的使用会占很大的篇幅,会在后续的博客里一个个分析
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)