1.Main(int argc, char *argv[])
argc表示命令行参数的个数
2. new、delete、malloc、free关系
delete会调用对象的析构函数, new调用构造函数。malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。
3.多态,虚函数,纯虚函数
多态:是对于不同对象接收相同消息时产生不同的动作。在程序运行时的多态性通过继承和虚函数来体现;在程序编译时多态性体现在函数和运算符的重载上;
虚函数:在基类中冠以关键字 virtual 的成员函数。 它提供了一种接口界面。
纯虚函数的作用:在基类中为其派生类保留一个函数的名字,以便派生类根据需要对它进行定义。作为接口而存在 纯虚函数不具备函数的功能,一般不能直接被调用。
从基类继承来的纯虚函数,在派生类中仍是虚函数。如果一个类中至少有一个纯虚函数,那么这个类被称为抽象类
抽象类中不仅包括纯虚函数,也可包括虚函数。
4.在什么时候需要使用“常引用”?
如果既要利用引用提高程序的效率,又要保护传递给函数的数据不在函数中被改变,就应使用常引用。
5.重载(overload)、重写(overried,有的书也叫做“覆盖”)和隐藏的区别?
重载:存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。
重写:是指子类重新定义父类虚函数的方法。
重载:这两个函数的调用,在编译器间就已经确定了,是静态的。它们的地址在编译期就绑定了,重载和多态无关!
重写:和多态真正相关。当子类重新定义了父类的虚函数后,父类指针根据赋给它的不同的子类指针,动态的调用属于子类的该函数,这样的函数调用在编译期间是无法确定的
“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下:
(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏
(2)派生类的函数与基类的函数同名,参数也相同,但是基类函数没有virtual 关键字。此时,基类的函数被隐藏
6.引用与指针有什么区别?
引用必须被初始化,指针不必;引用初始化以后不能被改变,指针可以改变所指的对象;不存在指向空值的引用,但是存在指向空值的指针。 常引用:利用引用提高程序效率,又要保护传递给函数的数据不在函数中改变
7.关键字static的作用
函数体内 static 变量的作用范围为该函数体,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值
在模块内的 static 全局变量可以被模块内所有函数访问,但不能被模块外其他函数访问
在类的static 成员变量属于整个类所拥有,对类的所以对象只有一份拷贝,这个函数不接收 this 指针
8.STL库用过吗?常见的STL容器有哪些?算法用过哪几个?
STL包括两部分内容:容器和算法。序列式容器,其中的元素不一定有序,但都可以被排序。如:vector、list、queue;关联式容器,每个元素都有一个键值和一个实值,元素按照一定的规则存放。map、hashtable。
9.什么是内存泄漏?面对内存泄漏和指针越界,你有哪些方法?采用哪些方法来避免和减少这类错误?
用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元即为内存泄露。使用的时候要记得指针的长度,malloc的时候得确定在那里free,对指针赋值的时候应该注意被赋值指针需要不需要释放,动态分配内存的指针最好不要再次赋值.
10.内联函数与宏有什么区别
内联函数在编译时展开,宏在预编译时展开,在编译的时候内联函数可以直接被嵌入到目标代码中,而宏只是一个简单的文本替换,内联函数可以完成诸如类型检测、语句是否正确等编译功能,宏就不具备这样的功能
11.智能指针
每次创建类的新对象时,初始化指针并将引用计数置为1;当对象作为另一对象的副本而创建时,拷贝构造函数拷贝指针并增加与之相应的引用计数;对一个对象进行赋值时,赋值操作符减少左操作数所指对象的引用计数,并增加右操作数所指对象的引用计数;调用析构函数时,构造函数减少引用计数。
12.用两个栈实现一个队列的功能?
设2个栈为A,B, 一开始均为空.将新元素push入栈A;(1)判断栈B是否为空;(2)如果不为空,则将栈A中所有元素依次pop出并push到栈B;(3)将栈B的栈顶元素pop出;
du 查看目录大小 du -h /home带有单位显示目录信息
df 查看磁盘大小 df -h 带有单位显示磁盘信息
/etc/profile 系统环境变量
.bashrc 用户环境变量
netstat 显示网络状态信息
1、构造Hessian矩阵,计算特征值α
Sift采用的是DOG图像,而surf采用的是Hessian矩阵行列式近似值图像。首先是图像中某个像素点的Hessian矩阵:
其中,Lxx、Lxy、Lyy为高斯滤波后图像g(σ)在各个方向的二阶导数。
由于求Hessian时要先高斯平滑,然后求二阶导数,这在离散的像素点是用模板卷积形成的,这2种操作合在一起用一个模板代替就可以了,比如说y方向上的模板如下,以9*9的模板为例:
图中灰色像素代表0;上图中1为y方向的先高斯滤波然后二阶求导的处理,近似处理为图3,图2位x和y方向上的先高斯滤波然后二阶混合偏导,近似为图4。
有了这个近似的模板以后,计算高斯滤波和二阶导数两个步骤就可以一个步骤完成,同时,为了提高计算效率,还引入了积分图像的概念,提高了速度。
2、构造高斯金字塔
相比于sift算法的高斯金字塔构造过程,sift算法速度有所提高。在sift算法中,每一组(octave)的图像大小是不一样的,下一组是上一组图像的降采样(1/4大小);在每一组里面的几幅图像中,他们的大小是一样的,不同的是他们采用的尺度σ不同。而且在模糊的过程中,他们的高斯模板大小总是不变的,只是尺度σ改变。对于surf算法,图像的大小总是不变的,改变的只是高斯模糊模板的尺寸,当然,尺度σ也是在改变的。
上图中a为高斯模板保持不变,图像大小改变的情况,适用于sift算法,图b是高斯模板改变,图像大小保持不变的情况,适用于surf算法。因为surf算法没有了降采样的过程,因此处理速度得到提高。
3、定位特征点
首先初步定为特征点,如下图,将经过hessian矩阵处理过的每个像素点与其3维领域的26个点进行大小比较,如果它是这26个点中的最大值或者最小值,则保留下来,当做初步的特征点。
4、确定特征点主方向
为了保证旋转不变性,在SURF中,不统计其梯度直方图,而是统计特征点领域内的Harr小波特征。即以特征点为中心,计算半径为6s(S为特征点所在的尺度值)的邻域内,统计60度扇形内所有点在x(水平)和y(垂直)方向的Haar小波响应总和(Haar小波边长取4s),并给这些响应值赋高斯权重系数,使得靠近特征点的响应贡献大,而远离特征点的响应贡献小,然后60度范围内的响应相加以形成新的矢量,遍历整个圆形区域,选择最长矢量的方向为该特征点的主方向。这样,通过特征点逐个进行计算,得到每一个特征点的主方向。该过程的示意图如下:
5、构造特征描述子
在特征点周围取一个正方形框,框的边长为20s(s是所检测到该特征点所在的尺度)。该框带方向,方向当然就是第4步检测出来的主方向了。然后把该框分为16个子区域,每个子区域统计25个像素的水平方向和垂直方向的haar小波特征,这里的水平和垂直方向都是相对主方向而言的。该haar小波特征为水平方向值之和,水平方向绝对值之和,垂直方向之和,垂直方向绝对值之和。该过程的示意图如下所示:
这样每个小区域就有4个值,所以每个特征点就是16*4=64维的向量,相比sift而言,少了一半,这在特征匹配过程中会大大加快匹配速度。
柱面投影是以圆柱的中心做为视点的中心,以圆柱中心环绕一周采集多张重叠图像,根据重叠区域将多幅图像通过柱面投影变换将变换后的图像贴到圆柱面上,形成柱面全景图。柱面模型如图3.5所示
图3.5 柱面模型 图3.6 XOZ截面图 图3.6 YOZ截面图
我们假定,光轴与图像平面的交点就是图像的中心点,所有的照相机运动都是发生在XZ平面。如图3.5中所示,原始图像为I、柱面K和投影柱面图像J,观察点(投影中心)O。现在是要得到在O点观察图像I在柱面K上的投影影像J,设柱面半径为r(r=f),投影角为,图像宽度为W,高度为H,可以得到柱面图像的宽度为,高度仍然为H。图像的像素坐标是以像素在图像上的位置定义的,左上角像素为原点。
(3.12)
由推出r为:
(3.13)
对图像I上的任意一点P,假设它在图像上的坐标为,现在我们要算出P在柱面图像J上的对应点Q,假设Q在J上的坐标是。对点P,沿XZ平面的横截面,如图3.6,这时可得:
(3.14)
是P点到Y轴的垂线与Z轴的夹角,它可以由下面的公式决定:
(3.15)
综合以上公式,可得到水平坐标的对应公式:
(3.16)
同理,对点P,沿YZ平面的纵截面如图3.7所示。设P和O的连线OP与
XZ平面的夹角为,则有:
(3.17)
(3.18)
由此,我们可以推出:
(3.19)
综合以上,得到柱面投影公式: