博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Harris角点检测
阅读量:4559 次
发布时间:2019-06-08

本文共 3588 字,大约阅读时间需要 11 分钟。

角点:最直观的印象就是在水平、竖直两个方向上变化均较大的点,即Ix、Iy都较大

边缘:仅在水平、或者仅在竖直方向有较大的变化量,即Ix和Iy只有其一较大
平坦地区:在水平、竖直方向的变化量均较小,即Ix、Iy都较小

2 strong eigenvalues======interest point

1 strong eigenvalues======contour/edge

0 eigenvalues             ======uniform region

角点响应

R=det(M)-k*(trace(M)^2)   (k=0.04~0.06)

det(M)=λ1*λ2      trace(M)=λ1+λ2

R取决于M的特征值,对于角点|R|很大,平坦的区域|R|很小。

编程步骤:

使用opencv进行测试:

#include "stdafx.h"#include "cv.h"#include "highgui.h"void drawcross(CvArr* img,CvPoint2D32f pt){    const int radius=3;    int ptx=cvRound(pt.x);    int pty=cvRound(pt.y);    int ls=ptx-radius;    int re=ptx+radius;    int us=pty-radius;    int de=pty+radius;    cvLine(img,cvPoint(ls,pty),cvPoint(re,pty),CV_RGB(0,0,255),1,0);    cvLine(img,cvPoint(ptx,us),cvPoint(ptx,de),CV_RGB(0,0,255),1,0);}int main(int argc, char* argv[]){    CvPoint2D32f pt[100];    int cornercount=30;    IplImage* srcimg=cvLoadImage("2.bmp");    IplImage* grayimg=cvCreateImage(cvGetSize(srcimg),IPL_DEPTH_8U,1);    IplImage* eigimg=cvCreateImage(cvGetSize(srcimg),IPL_DEPTH_32F,1);    IplImage* tempimg=cvCloneImage(eigimg);    //cvConvertImage(srcimg,grayimg,0);    cvCvtColor(srcimg,grayimg,CV_BGR2GRAY);    cvGoodFeaturesToTrack(grayimg,eigimg,tempimg,pt,&cornercount,0.1,10,NULL,3,0,0.04);    for(int i=0;i

不适用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大小的...求导CvMat *mbys(CvMat *mat,int xwidth,int ywidth,double *a,int size1,int size2){    int i,j;    int i1,j1;    int px,py;    int m;    CvMat *mat1;    mat1=cvCloneMat(mat);    for(i=size1/2;i
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,int ywidth,int size,double thresh){ CvMat *mat; int i,j; mat=cvCreateMat(ywidth,xwidth,CV_32FC1); for(i=size/2;i
thresh)//然后大于这个阈值 CV_MAT_ELEM(*mat,int,i,j)=255;//满足上两个条件,才是角点! else CV_MAT_ELEM(*mat,int,i,j)=0; } return mat;}CvPoint* CHarris::harris_features(IplImage *src,int gausswidth,double sigma,int size,int 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图像 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); const int cxDIB=src->width ; // 图像宽度 const int cyDIB=src->height; // 图像高度 double *I=new double[cxDIB*cyDIB]; cvCvtColor(src,pImgGray,CV_RGB2GRAY);//灰度化 dst=cvCloneImage(src); int i,j; for(j=0;j

转载于:https://www.cnblogs.com/doucontorl/archive/2011/01/02/1924157.html

你可能感兴趣的文章
EasyPlayer RTSP Android安卓播放器修复播放画面卡在第一帧bug
查看>>
web项目中全局常量的添加
查看>>
搬运工程 启动!
查看>>
局部加权回归(LWR) Matlab模板
查看>>
Connect to the DSP on C6A8168/DM8168/DM8148 using CCS
查看>>
hibernate在使用getCurrentSession时提示no session found for current thread
查看>>
【Luogu1471】方差(线段树)
查看>>
DEV中svg图标的使用
查看>>
markdown测试
查看>>
Java-Maven-Runoob:Maven 依赖管理
查看>>
杂项-Log:log4net
查看>>
杂项-Java:EL表达式
查看>>
tarroni music
查看>>
unity 使用RotateAround的使用注意
查看>>
[SDOI2009]HH的项链
查看>>
CodeFirst模式,容易引发数据迁移问题(不建议使用)
查看>>
jquery的colorbox关闭并传递数据到父窗
查看>>
使用Nginx、Keepalived构建文艺负载均衡
查看>>
phpmyadmin 开放远程登录的权限
查看>>
linux安装gcc和gcc-c++
查看>>