RANSAC与ICP算法

RANSAC算法输入是一组观测数据,一个可以解释或者适应于观测数据的参数化模型,一些可信的参数。

RANSAC通过反复选择数据中的一组随机子集来达成目标。被选取的子集被假设为局内点,并用下述方法进行验证:

1。有一个模型适应于假设的局内点,即所有的未知参数都能从假设的局内点计算得出。

2。用1中的得到的模型去测试所有的其它数据,如果某个点适用于估计的模型,认为它也是局内点。

3。如果有足够多的点呗归类为假设的局内点,那么估计的模型就足够合理。

4。然后,用所有的假设的局内点去重新估计模型,因为它仅仅被初始的假设局内点估计过。

5.最后,通过估计局内点与模型的错误率来评估模型。

对应点集配准算法是假设一个理想的状况,将一个模型点云数据X利用四元数旋转,并平移得到点云P。而对应点集配准算法主要就是怎么计算出QR和QT的,知道这两个就可以匹配点云了。

但是对应点集配准算法的前提条件是计算中的点云数据PB和PR的元素一一对应,这个条件在现实里因误差等问题,不太可能实践,所以就有了ICP算法

ICP算法是从院点云上的每个点先计算出目标点云的每个点的距离,使每个点和目标云的最近点匹配,这样满足了对应点集配准算法的前提条件,每个点都有了对应的映射点,则可以按照对应点集配准算法计算,但应为这个是假设,所以需要重复迭代运行上述过程,直到均方差小于某个阈值。

边缘检测中的Sobel,Robert,Prewitt,Laplacian,Canny

不同图像灰度不同,见解处一般会有明显的边缘,利用此特征可以分割图像。需要说明的是:边缘和物体之间的边界并不等同,边缘指的是图像中像素的值有突变的地方,而物体间的边界指的是现场景中的存在于物体之间的边界。有可能有边缘的地方并非边界,也有可能边界的地方并无边缘,应为现实世界中的物体是三维的,而图像只有具体的二维信息,从三维到二维的投影成像不可避免的会丢失一部分信息;另外,成像过程中的光照和噪声也是不可避免的重要因素。正式因为这些原因,基于边缘的图像分割仍然是当前图像研究中的世界级难题,目前研究者正在试图在边缘提取中加入高层的语义信息。

在实际图像分割中,旺旺只用到一阶和二阶到时,虽然,原理上,可以用更高阶的到时,但是,因为噪声的影响,在纯粹的导数操作中就会出现对噪声的敏感现象,三阶以上的导数信息往往失去了应用价值。二阶导数还是可以说明灰度突变的类型。在有些情况下,如灰度变化均匀的图像,只利用一阶到时可能找不到边界,此时二阶到时就能提供很有用的信息。二阶导数对噪声也比较敏感,解决的方法是先对图像进行平滑滤波,消除部分噪声,再进行边缘检测。不过,利用二阶导数信息的算法是基于过零检测的,因此得到的边缘点数比较少,有利于后续的处理和识别工作。

各种算子的存在就是对这种导数分割原理进行的实例化计算,是为了在计算过程中直接使用的一种计算单位。

roberts算子:边缘定位准,单数对噪声敏感。适用于边缘明显且噪声较少的图像分割。roberts边缘检测算子是一种利用局部差分算子寻找边缘的算子,roberts算子图像处理后结果边缘不是很平滑。经分析,由于roberts算子通常会在图像边缘附近的区域内产生较宽的响应,故采用上述算子检测的边缘图像常需做细化处理,边缘定位的精细度不是很高。

prewitt算子:对噪声有抑制作用,抑制噪声的原理是通过像素平均,但是像素平均相当于图像的低通滤波,所以prewitt算子对边缘的定位不如roberts算子。

sobel算子:sobel算子和prewitt算子都是加权平均,但是sobel算子认为,领域的像素对当前像素产生的影响不是等价的,所以距离不同的像素具有不同的权值,对算子结果产生的影响也不同。一般来说,距离越远,产生的影响越小。

lsotropic sobel算子:加权平均算子,权值反比于邻点与中心点的距离,当沿不同方向检测边缘时梯度幅度一致,就是通常所说的各向同性。

在边沿检测中,常用的一种模板是sobel算子。sobel算子有两个,一个是检测水平边沿的,另一个是检测垂直边沿的。sobel算子另一种形式是各向同性sobel算子,也有两个,一个是检测水平边沿的,另一个是检测垂直边沿的。各向同性sobel算子和普通sobel算子相比,它的位置加权系数更为准确,在检测不同方向的边沿时梯度的幅度一致。由于建筑物图像的特殊性,我们可以发现,处理该类型图像轮廓时,并不需要对梯度方向进行运算,所以程序并没有给出各向同性sobel算子的处理方法。

由于sobel算子是滤波算子的形式,用于提取边缘,可以利用快速卷积函数,简单有效,因此应用广泛。美中不足的是,sobel算子并没有将图像的主体与北京严格的区分开来,换言之就是sobel算子没有基于图像灰度进行处理,由于sobel算子并备有严格地模拟人的视觉生理特征,所以提取的图像轮廓有时并不能令人满意。在观测一幅图像的时候,我们往往首先注意的是图像与背景不同的部分,正是这个部分将主体突出显示,基于该理论,我们可以给出阈值化轮廓提取算法,该算法已在数学上证明当像素点满足正太分布时所求解是最优的。

上面的算子是利用一阶导数的信息,属于梯度算子范畴。

laplacian算子:这是二阶微分算子。其具有各向同性,即与坐标轴方向无关,坐标轴旋转后梯度结果不变。但是,其对噪声比较敏感,所以图像一般先经过平滑处理,因为平滑处理也是用模板进行的,所以,通常的分割算法都是把laplacian算子和平滑算子结合起来生成一个新的模板。

laplacian算子一般不以其原始形式用于边缘检测,应为其作为一个二阶导数,laplacian算子对噪声具有无法接受的敏感性;同时其幅值产生算边缘,这是复杂的分割不希望有的结果;最后laplacian算子不能检测边缘的方向;所以Laplacian在分割中所起的作用包括:(1)利用它的零交叉性质进行边缘定位;(2)确定一个像素是在一条边缘暗的一面还是亮的一面;一般使用的是高斯型拉普拉斯算子(laplacian of a gaussian,log),由于二阶导数是线性运算,利用log卷积一副图像与首先使用高斯平滑函数卷积改图像,然后计算所得结果的拉普拉斯是一样的。所以在log公式中使用高斯函数的目的就是对图像进行平滑处理,使用laplacian算子的目的是提供一副用零交叉确定的边缘位置的图像;图像的平滑处理减少了噪声的影响并且它的主要作用还是抵消由laplacian算子的二阶到时引起的逐渐增加的噪声影响。

error : 未能加载项目文件。缺少根元素

虽然重装能解决此问题,但是有更好的方法

爆错是由于C:\Users\coolboy\AppData\Local\Microsoft\MSBuild\v4.0(目录自行修改)下的Microsoft.Cpp.Win32.user或Microsoft.Cpp.x64.user出问题了

修改下

Microsoft.Cpp.Win32.user

<?xml version=”1.0″ encoding=”utf-8″?>
<Project DefaultTargets=”Build” ToolsVersion=”4.0″ xmlns=”http://schemas.microsoft.com/developer/msbuild/2003″>

</Project>

Microsoft.Cpp.x64.user

<?xml version=”1.0″ encoding=”utf-8″?>
<Project DefaultTargets=”Build” ToolsVersion=”4.0″ xmlns=”http://schemas.microsoft.com/developer/msbuild/2003″>

</Project>

虚函数及继承

虚函数是通过虚表实现的

虚函数按照其声明吮吸放在表中

派生类中,当派生类拥有自己的虚函数时,父类的虚函数在子类的虚函数前面,如果同名,将父类的虚函数覆盖

多其继承情况下,虚表是个二维数组,他们独立歌不影响

入child继承自father1和father2,father1和father2都有函数f(),当子类没有声明f时,调用时按照指针来的,就是看父类指针是啥就叫啥。

c++运算符号优先级

1:

::   ++(后置)   –(后置)   {}   []   .   ->

2:

++(前置)   –(前置)   +(正号)   -(负号)   !   ~   (type)(强制转换)   *(指针值)   &(取地址)

3:

.*    ->*

4:

*    /    %

5:

+   –

6:

<<   >>

7:

<   <=   >=   >

8:

==   !=

9:

&(与)

10:

^(异或)

11:

|(或)

12:

&&

13:

||

14:

=   +=   -=   *=   /=   %=   <<=   >>=   &=   ^=   |=

15:

throw

16:

,

 

条件变量pthread_cond_wait

条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待”条件变量的条件成立”而挂起;另一个线程使”条件成立”(给出条件成立信号)。为了防止竞争,条件变量的使用总是和一个互斥锁结合在一起。

关键问题在于多了一个互斥锁,这个是防止唤醒多个线程用的,还有就是pthread_cond_wait存在被意外唤醒的可能,所以还要加while判断

所以标准写法就是

pthread_mutex_lock();

while(???){pthread_cond_wait();}

pthread_mutex_unclock();

 

pthread_mutex_lock();

pthread_cond_signal();

pthread_mutex_unclock();