Harris角点检测算法详解
更新时间:2023-03-08 20:45:12 阅读量: 综合文库 文档下载
不适用opencv的代码(转)
////////////////////////////////////////////////////////////////////// // Construction/Destruction
////////////////////////////////////////////////////////////////////// #define B(image,x,y) ((uchar *)(image->imageData+image->widthStep*(y)))[(x)*3] #define G(image,x,y) ((uchar *)(image->imageData+image->widthStep*(y)))[(x)*3+1] #define R(image,x,y) ((uchar *)(image->imageData+image->widthStep*(y)))[(x)*3+2] #define S(image,x,y) ((uchar *)(image->imageData+image->widthStep*(y)))[(x)]
//卷积计算求Ix,Iy,以及滤波
//a指向的数组是size1*size2(滤波器大小)大小的...求导,a 指滤波器,xwidth,ywidth指图像大小 px=i-size1/2+i1;py=j-size2/2+j1;分别消掉了size1/2,size2/2,所以这样就更好理解了。 for(i=size1/2;i CvMat *mbys(CvMat *mat,intxwidth,intywidth,double *a,int size1,int size2)//size { inti,j; int i1,j1; intpx,py; int m; CvMat *mat1; mat1=cvCloneMat(mat); for(i=size1/2;i //CV_MAT_ELEM访问矩阵元素 m+=CV_MAT_ELEM(*mat,double,px,py)*a[i1*size1+j1]; } CV_MAT_ELEM(*mat1,double,i,j)=m; } return mat1; } //计算Ix2,Iy2,Ixy CvMat *mbxy(CvMat *mat1,CvMat *mat2,int xwidth,intywidth) { inti,j; CvMat *mat3; mat3=cvCloneMat(mat1); for(i=0;i CV_MAT_ELEM(*mat3,double,i,j)=CV_MAT_ELEM(*mat1,double,i,j)*CV_MAT_ELEM(*mat2,double,i,j); } return mat3; } //用来求得响应度 CvMat *mbcim(CvMat *mat1,CvMat *mat2,CvMat *mat3,int xwidth,intywidth) { inti,j; CvMat *mat; mat=cvCloneMat(mat1); for(i = 0; i for(j = 0; j //注意:要在分母中加入一个极小量以防止除数为零溢出 CV_MAT_ELEM(*mat,double,i,j)=(CV_MAT_ELEM(*mat1,double,i,j)*CV_MAT_ELEM(*mat2,double,i,j)- CV_MAT_ELEM(*mat3,double,i,j)*CV_MAT_ELEM(*mat3,double,i,j))/ (CV_MAT_ELEM(*mat1,double,i,j)+CV_MAT_ELEM(*mat2,double,i,j)+0.000001); } } return mat; } //用来求得局部极大值 CvMat *mblocmax(CvMat *mat1,int xwidth,intywidth,int size) { inti,j; double max=-1000; int i1,j1; intpx,py; CvMat *mat; mat=cvCloneMat(mat1); for(i=size/2;i for(i1=0;i1 for(j1=0;j1 if(CV_MAT_ELEM(*mat1,double,px,py)>max) max=CV_MAT_ELEM(*mat1,double,px,py); } if(max>0) CV_MAT_ELEM(*mat,double,i,j)=max; else CV_MAT_ELEM(*mat,double,i,j)=0; } return mat; } //用来确认角点 CvMat *mbcorner(CvMat *mat1,CvMat *mat2,int xwidth,intywidth,intsize,double thresh) { CvMat *mat; inti,j; mat=cvCreateMat(ywidth,xwidth,CV_32FC1); for(i=size/2;i if(CV_MAT_ELEM(*mat1,double,i,j)==CV_MAT_ELEM(*mat2,double,i,j))//首先取得局部极大值 //mat1是CRF相应的所有。Mat2是CRF局部极大值点. if(CV_MAT_ELEM(*mat1,double,i,j)>thresh)//然后大于这个阈值 CV_MAT_ELEM(*mat,int,i,j)=255;//满足上两个条件,才是角点! else CV_MAT_ELEM(*mat,int,i,j)=0; } return mat; } CvPoint* threshold) { CvMat *mat_I,*mat_Ix,*mat_Iy,*mat_Ixy,*mat_Ix2,*mat_Iy2;//相应的矩阵 IplImage *pImgGray=NULL; //灰度图像 IplImage *dst=NULL; //目标图像 IplImage *pImgDx=NULL; //水平梯度卷积后的图像 IplImage *pImgDy=NULL; //竖起梯度卷积后的图像 IplImage *pImgDx2=NULL;//Ix2图像 IplImage *pImgDy2=NULL;//Iy2图像 CHarris::harris_features(IplImage *src,intgausswidth,doublesigma,intsize,int IplImage *pImgDxy=NULL;//Ixy图像 pImgGray=cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1); dst=cvCreateImage(cvGetSize(src),src->depth,3); pImgDx=cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1);//创建图像 pImgDy=cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1); pImgDx2=cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1); pImgDy2=cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1); pImgDxy=cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1); constintcxDIB=src->width ; // 图像宽度 constintcyDIB=src->height; // 图像高度 double *I=new double[cxDIB*cyDIB]; cvCvtColor(src,pImgGray,CV_RGB2GRAY);//灰度化 dst=cvCloneImage(src); inti,j; for(j=0;j I[j*cxDIB+i]=S(pImgGray,i,j);//将灰度图像数值存入I中 } mat_I=cvCreateMat(cyDIB,cxDIB,CV_64FC1); cvInitMatHeader(mat_I,cyDIB,cxDIB,CV_64FC1,I);//用I来初始化相应的矩阵 // cout< //-------------------------------------------------------------------------- // 第一步:利用差分算子对图像进行滤波 //-------------------------------------------------------------------------- //定义水平方向差分算子并求Ix double dx[9]={-1,0,1,-1,0,1,-1,0,1}; mat_Ix=mbys(mat_I,cxDIB,cyDIB,dx,3,3); //求Ix矩阵 // cout< //定义垂直方向差分算子并求Iy double dy[9]={-1,-1,-1,0,0,0,1,1,1}; mat_Iy=mbys(mat_I,cxDIB,cyDIB,dy,3,3);//求Iy矩阵 // cout< S(pImgDx,i,j)=CV_MAT_ELEM(*mat_Ix,double,j,i);//为相应图像赋值 S(pImgDy,i,j)=CV_MAT_ELEM(*mat_Iy,double,j,i); } mat_Ix2=mbxy(mat_Ix,mat_Ix,cxDIB,cyDIB);//计算Ix2,Iy2,Ixy矩阵 mat_Iy2=mbxy(mat_Iy,mat_Iy,cxDIB,cyDIB); mat_Ixy=mbxy(mat_Ix,mat_Iy,cxDIB,cyDIB); for(j=0;j S(pImgDxy,i,j)=CV_MAT_ELEM(*mat_Ixy,double,j,i);//为相应图像赋值 S(pImgDx2,i,j)=CV_MAT_ELEM(*mat_Ix2,double,j,i); S(pImgDy2,i,j)=CV_MAT_ELEM(*mat_Iy2,double,j,i); } //-------------------------------------------------------------------------- // 第二步:对Ix2/Iy2/Ixy进行高斯平滑,以去除噪声 //-------------------------------------------------------------------------- //本例中使用5×5的高斯模板 //计算模板参数 //intgausswidth=5; //double sigma=0.8; double *g=new double[gausswidth*gausswidth]; for(i=0;i g[i*gausswidth+j]=exp(-((i-int(gausswidth/2))*(i-int(gausswidth/2))+(j-int(gausswidth/2))*(j-int(gausswidth/2)))/(2*sigma)); //归一化:使模板参数之和为1(其实此步可以省略) double total=0; for(i=0;i for(i=0;i //进行高斯平滑 mat_Ix2=mbys(mat_Ix2,cxDIB,cyDIB,g,gausswidth,gausswidth); mat_Iy2=mbys(mat_Iy2,cxDIB,cyDIB,g,gausswidth,gausswidth); mat_Ixy=mbys(mat_Ixy,cxDIB,cyDIB,g,gausswidth,gausswidth); //-------------------------------------------------------------------------- // 第三步:计算角点量 //-------------------------------------------------------------------------- //计算cim:即cornerness of image,我们把它称做‘角点量’ CvMat *mat_cim; mat_cim=mbcim(mat_Ix2,mat_Iy2,mat_Ixy,cxDIB,cyDIB); // cout< //-------------------------------------------------------------------------- // 第四步:进行局部非极大值抑制 //-------------------------------------------------------------------------- CvMat *mat_locmax; //constint size=7; mat_locmax=mblocmax(mat_cim,cxDIB,cyDIB,size); // cout< //-------------------------------------------------------------------------- // 第五步:获得最终角点 //-------------------------------------------------------------------------- CvMat *mat_corner; //const double threshold=4500; //intcornernum=0; mat_corner=mbcorner(mat_cim,mat_locmax,cxDIB,cyDIB,gausswidth,threshold); //CCommonCommonClass; CvPointpt[5000]; for(j=size/2;j if(CV_MAT_ELEM(*mat_corner,int,j,i)==255) { pt[cornerno].x=i; pt[cornerno].y=j; cornerno++; // CommonClass.DrawCross(showImg2,pt,CV_RGB(0,0,255),1,4); // cvCircle(dst,pt,2,CV_RGB(255,0,0),1,8,0); // cout< //-------------------------------------------------------------------------- // 第四步:进行局部非极大值抑制 //-------------------------------------------------------------------------- CvMat *mat_locmax; //constint size=7; mat_locmax=mblocmax(mat_cim,cxDIB,cyDIB,size); // cout< //-------------------------------------------------------------------------- // 第五步:获得最终角点 //-------------------------------------------------------------------------- CvMat *mat_corner; //const double threshold=4500; //intcornernum=0; mat_corner=mbcorner(mat_cim,mat_locmax,cxDIB,cyDIB,gausswidth,threshold); //CCommonCommonClass; CvPointpt[5000]; for(j=size/2;j if(CV_MAT_ELEM(*mat_corner,int,j,i)==255) { pt[cornerno].x=i; pt[cornerno].y=j; cornerno++; // CommonClass.DrawCross(showImg2,pt,CV_RGB(0,0,255),1,4); // cvCircle(dst,pt,2,CV_RGB(255,0,0),1,8,0); // cout<
正在阅读:
Harris角点检测算法详解03-08
敦煌的旅游现状和旅游前景10-11
读后感03-08
电子支付与网络金融在线作业04-26
中国光伏市场投资分析-韩启明07-18
教师资格证考试《幼儿园保教知识与能力》终极押密试卷(2)10-28
各省军区独立师历史沿革04-25
各省军区独立师历史沿革03-10
解读《75号文外汇登记最新规定汇发〔2011〕19号文》09-12
个人网站毕业论文(2) - 图文04-29
- 2010全国高考数学(理)考试大纲
- 2016-2017学年江苏省无锡市高三(上)期末数学试卷和答案
- 2013年河南省专升本经济学考试真题
- 珠海万利达保护整定示例
- 60kV厂用电进线电源二次回路设计(1)(DOC) - 图文
- 2017最新二年级数学教师家长会发言稿
- 医院地震应急预案
- 小学化倾向在幼儿教育中的问题及对策
- 软件测试毕设论文 - 图文
- 2016年贵州省普通高中学业水平物理模拟试卷(解析版)
- 用友java面试题(附答案)
- 2005-2013年上海市大同中学杯初中物理竞赛初赛试卷及答案 - 图文
- 深圳市国家税务局办税指南
- 进出口货物征税管理办法条文及释义
- 科目一理论考试题900道 - 图文
- 机械制造与自动化本科毕业设计论文-数控车床的改造
- 2016年五年级上册写字教案完整通过版
- 涉外谈判与国内谈判有何异同点,简要说明。(出自第七单元)
- 小学班主任培训讲稿
- 2011届高考复习最新6年高考4年模拟分类汇编:专题二十一+
- 算法
- 详解
- 检测
- Harris
- 劳动合同 简易版
- 某道路绿化铺装工程施工组织设计方案(1)
- 资本论课程试题
- 安全生产专项检查
- 软件测试之软件测试流程(word-1)
- 2018-2019年初中英语宁夏初三中考模拟全真试卷含答案考点及解
- 数据结构 各种排序算法性能比拼
- 桥梁工程试题库1
- 孙绍振谈2016年全国高考作文题 - 在理论与实践的关系中考察
- Windows Server 2008R2环境下https网站搭建教程
- 2018-2023年中国自助餐行业发展模式分析及投资战略研究报告-行业
- 古今名人论家谱
- 广东省2010定额取费费率表(增值税)
- 大学物理简明教程(吕金钟)第四章习题答案
- 2018年中国螺杆挤水机发展现状与市场前景分析(目录) - 图文
- 闻一多先生的说和做说课稿
- 公路工程平安工地实施方案
- 衡水中学分科综合卷语文(三) 衡水金卷 黄廉 文言文
- 理论力学习题及解答1
- 村民自治委员会委员责任制度