课程实验报告
2017- 2018学年第
课程名称:计算机视觉及应用 实验名称:harris角点检测 班 级: 学生姓名: 学号:
实验日期: 2017.12.6地点: 指导教师:
成绩评定:批改日期:
文案
一学期实用
本实验旨在清楚计算机视觉中角点的概念,学习推导并使用一实 验 种经典的角点检测算法,利用合适的编程仿真软件,用程序实现该目 角点检测算法并用此程序成功提取出示例图片上的角点。 的及要求 实验仪器设备 实验设备为一台装有win10系统的PC,qt+opencv软件。 实验原理 角点的概念:在现实世界中,角点对应于物体的拐角,道路的十字路口、丁字路口等。从图像分析的角度来说,角点可以是两个边缘的角点,角点也是领域内具有两个主方向的特征点,角点附近区域的像素点无论在梯度方向上还是其梯度幅值上有着较大变化。 Harris角点检测算法基本思想:使用一个固定窗口在图像上进行任意方向上的滑动,比较窗口中的像素灰度在窗口滑动前与滑动后的变化程度。如果在任意方向上的滑动都有着较大灰度值的变化,那么我们可以认为该窗口中存在角点。 1.理解Harris角点检测算法的实现原理; 2.从理论上推导Harris角点检测算法; 3.将Harris角点算法转变为代码的形式,通过程序验证Harris角点算法的可行性; 4.自定一张示例图片,用自己编写的程序提取出该示例图片中的角点。 实验内容 文案
实用
1.Harris角点检测算法的理论推导: 首先建立一个数学模型:当窗口发生移动时,滑动前与滑动后的窗口中的像素点灰度变化用以下方式描述: E(u,v)=∑(i(x+u,y+v)−i(x,y))2 u,v其中i(x+u,y+v),i(x,y)分别表示平移前后灰度值的变化。在上式中添加权重w(x,y),则描述其变化函数为: E(u,v)=∑w(x,y)(i(x+u,y+v)−i(x,y))2 u,v对i(x+u,y+v)进行一阶泰勒展开: 实验22因为o(x+y)对变化贡献不大,故忽略此项不计,则上式可写步骤及为: 方2()()()E(u,v)=wx,yx,yu+ix,yv) ∑(i法 xyu,vi(x+u,y+v)=i(x,y)+ix(x,y)u+iy(x,y)v+o(x2+y2) 将上式平方项展开并写成矩阵形式,即: (ix(x,y)u+iy(x,y)v)2=ix(x,y)2u2+iy(x,y)2v2+2ix(x,y)iy(x,y)uv ix(x,y)ix(x,y)ix(x,y)iy(x,y)u=(u,v)[]() iy(x,y)ix(x,y)iy(x,y)iy(x,y)v对于变化函数E(u,v),其本质为自相关函数,对其进行变换为: ∑i2 x(u,v) (u,v)∈wE(u,v)=(u,v) ∑iy(x,y)ix(x,y)[(u,v)∈w∑iy(x,y)ix(x,y) u(u,v)∈w() v()u,v∑i2 y](u,v)∈w文案
实用
令A=∑(u,v)∈wi2x(u,v),B=∑(u,v)∈wiy(x,y)ix(x,y),C=∑(u,v)∈wi2y(u,v),则上式可写为: AE(u,v)=(u,v)[BBu]()=M CvAB]=BCM是一个实对称阵,则其必定可以相似对角化且存在:PMP−1=PMPT,存在一个变换矩阵P,使得x=Px‘,[λP[100−1λ]P= P[1λ20λ1,2V1,20T]P。求出其特征值及特征向量分别为: λ2(A+C)±√(A−C)2+(2B)2= 2C)2(2B)2T√(A−1+=[(A−C)±22,1] V1和V2正交,进一步化简E: E=x1(u,v)[x2y1λ1y2][00x1][λ2y1x2u′′λ1]=(u,v)[()y2v0λ2v′2 其中(u,vy1 y2]矩阵表示对(u,v)旋转。画出E(u,v)=1的等高线L,即:E=u′2(√1/λ1)2+v′2(√1/λ2)2=1 ′′)0u′](′)=λ1u′2+λ2vx1[x2x1=(u,v)[x2y1y2],由此看出E表征一个椭圆,而现在我们可以通过λ1和λ2去衡量变化量。此时有三种情况: ①假设λ1≫λ2不考虑v的前提下,u只需变化很小的量便可以使得E=1,同理λ2≫λ1,不考虑u的前提下,v只需变化很小的量便文案
实用
可以使得E=1,此时便可以说明在某一个方向上的变化很大,也就是说此时检测到的是图像的边缘。 ②假设λ1,λ2都很很小,那么u,v需很大的变化量才可以使得E=1,此时便可以说明在任意方向上的变化不明显,也就是说此时检测到的是图像平坦区域(灰度值变化不大的区域)。 ③假设λ1,λ2都很大,那么u,v只需很小的变化量就可以使得E=1,此时便可以说明在任意方向上的变化剧烈,也就是说此时检测到的是图像角点。 为了衡量这三种变化,找出其特征值与其的对应关系,建立数学表达式: R=λ1λ2−k(λ1+λ2)2 ①当R<0,检测到的为图像边缘;②当|R|非常小的时候,检测到的为图像中的平坦区域;③当R>0,检测到的为图像角点。 2.使用qt+opencv编写Harris角点检测程序,具体代码见实验数据; 3.使用编写的代码检测一张示例图片的角点。 OPENCV程序代码: #include 实用 intmax_thresh = 175; //最大阈值 void on_CornerHarris( int, void* );//回调函数 int main( intargc, char** argv ) { g_srcImage = imread( \"H:/picture/a.jpg\"); if(!g_srcImage.data ) { printf(\"no picture \\n\"); return false; } imshow(\"原始图\ g_srcImage1=g_srcImage.clone( ); cvtColor( g_srcImage1, g_grayImage, CV_BGR2GRAY ); on_CornerHarris( 0, 0 ); waitKey(0); return(0); } void on_CornerHarris( int, void* ) { Mat dstImage;//目标图 Mat normImage;//归一化后的图 Mat scaledImage;//线性变换后的八位无符号整型的图 dstImage = Mat::zeros( g_srcImage.size(), CV_32FC1 ); g_srcImage1=g_srcImage.clone( ); cornerHarris( g_grayImage, dstImage, 2, 3, 0.04, BORDER_DEFAULT ); 文案 实用 normalize( dstImage, normImage, 0, 255, NORM_MINMAX, CV_32FC1, Mat() ); convertScaleAbs( normImage, scaledImage ); for( int j = 0; j 实用 示例图片角点检测情况: 实验数据分析 及 处理 图一 图二 图一为示例图像,是最大阈值为160的时候harris的角点检测,其中红色小点即为检测到的角点,图二中是最大阈值为130的时候harris的角点检测,其中红色小点即为检测到的角点 实通过用示例图片对opencv编写的程序进行测试,发现用Harris验结角点检测算法可以较为准确的检测出图片中的角点,但图片中也有果很多角点未能被识别出来。同时可以通过设置不同的阈值是检测更分加准确。 析 实通过本次实验,是我对Harris角点检测有了更加深度的了解和验总理解。同时,也使得我对QT+OPENCV的运用更加熟练。明白了角点结 检测的意思和实际用途。 批改意见 签名: 年 月 日 文案 因篇幅问题不能全部显示,请点此查看更多更全内容