您好,欢迎访问三七文档
当前位置:首页 > 办公文档 > 会议纪要 > harris角点检测
课程实验报告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))2u,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))2u,v对i(x+u,y+v)进行一阶泰勒展开:i(x+u,y+v)=i(x,y)+ix(x,y)u+iy(x,y)v+o(x2+y2)因为o(x2+y2)对变化贡献不大,故忽略此项不计,则上式可写为:E(u,v)=∑w(x,y)(ix(x,y)u+iy(x,y)v)2u,v将上式平方项展开并写成矩阵形式,即:(ix(x,y)u+iy(x,y)v)2=ix(x,y)2u2+iy(x,y)2v2+2ix(x,y)iy(x,y)uv=(u,v)[ix(x,y)ix(x,y)ix(x,y)iy(x,y)iy(x,y)ix(x,y)iy(x,y)iy(x,y)](uv)对于变化函数E(u,v),其本质为自相关函数,对其进行变换为:E(u,v)=(u,v)[∑ix2(u,v)(u,v)∈w∑iy(x,y)ix(x,y)(u,v)∈w∑iy(x,y)ix(x,y)(u,v)∈w∑iy2(u,v)(u,v)∈w](uv)令A=∑ix2(u,v)(u,v)∈w,B=∑iy(x,y)ix(x,y)(u,v)∈w,C=∑iy2(u,v)(u,v)∈w,则上式可写为:E(u,v)=(u,v)[ABBC](uv)=MM是一个实对称阵,则其必定可以相似对角化且存在:PMP−1=PMPT,存在一个变换矩阵P,使得x=Px‘,[ABBC]=P[λ100λ2]P−1=P[λ100λ2]PT。求出其特征值及特征向量分别为:λ1,2=(A+C)±√(A−C)2+(2B)22V1,2=[12(A−C)±√(A−C)2+(2B)22,1]TV1和V2正交,进一步化简E:E=(u,v)[x1y1x2y2][λ100λ2][x1x2y1y2](uv)=(u′,v′)[λ100λ2](u′v′)=λ1u′2+λ2v′2其中(u′,v′)=(u,v)[x1y1x2y2],由此看出E表征一个椭圆,而[x1y1x2y2]矩阵表示对(u,v)旋转。画出E(u,v)=1的等高线L,即:E=u′2(√1/λ1)2+v′2(√1/λ2)2=1现在我们可以通过λ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①当R0,检测到的为图像边缘;②当|R|非常小的时候,检测到的为图像中的平坦区域;③当R0,检测到的为图像角点。2.使用qt+opencv编写Harris角点检测程序,具体代码见实验数据;3.使用编写的代码检测一张示例图片的角点。实验数据OPENCV程序代码:#includeopencv2/opencv.hpp#includeopencv2/highgui/highgui.hpp#includeopencv2/imgproc/imgproc.hppusingnamespacecv;usingnamespacestd;Matg_srcImage,g_srcImage1,g_grayImage;intthresh=30;//当前阈值intmax_thresh=175;//最大阈值voidon_CornerHarris(int,void*);//回调函数intmain(intargc,char**argv){g_srcImage=imread(H:/picture/a.jpg);if(!g_srcImage.data){printf(nopicture\n);returnfalse;}imshow(原始图,g_srcImage);g_srcImage1=g_srcImage.clone();cvtColor(g_srcImage1,g_grayImage,CV_BGR2GRAY);on_CornerHarris(0,0);waitKey(0);return(0);}voidon_CornerHarris(int,void*){MatdstImage;//目标图MatnormImage;//归一化后的图MatscaledImage;//线性变换后的八位无符号整型的图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(intj=0;jnormImage.rows;j++){for(inti=0;inormImage.cols;i++){if((int)normImage.atfloat(j,i)thresh+80){circle(g_srcImage1,Point(i,j),5,Scalar(10,10,255),2,8,0);circle(scaledImage,Point(i,j),5,Scalar(0,10,255),2,8,0);}}}imshow(g_srcImage1,g_srcImage1);imshow(scaledImage,scaledImage);}实验数据分析及处理示例图片角点检测情况:图一图二图一为示例图像,是最大阈值为160的时候harris的角点检测,其中红色小点即为检测到的角点,图二中是最大阈值为130的时候harris的角点检测,其中红色小点即为检测到的角点实验结果分析通过用示例图片对opencv编写的程序进行测试,发现用Harris角点检测算法可以较为准确的检测出图片中的角点,但图片中也有很多角点未能被识别出来。同时可以通过设置不同的阈值是检测更加准确。实验总结通过本次实验,是我对Harris角点检测有了更加深度的了解和理解。同时,也使得我对QT+OPENCV的运用更加熟练。明白了角点检测的意思和实际用途。批改意见签名:年月日
本文标题:harris角点检测
链接地址:https://www.777doc.com/doc-5318328 .html