Moravec角点检测算法原理

参考资料:

(1)Moravec角点检测算法原理
Moravec 角点检测算法是最早的角点检测算法之一。该算法将角点定义为具有低“自相关性”的点。算法会检测图像的每一个像素,将像素周边的一个邻域作为一个patch,并检测这个patch和周围其他patch的相关性。这种相关性通过两个patch间的平方差之和(SSD)来衡量,SSD值越小则相似性越高。
如果像素位于平滑图像区域内,周围的patch都会非常相似。如果像素在边缘上,则周围的patch在与边缘正交的方向上会有很大差异,在与边缘平行的方向上则较为相似。而如果像素是各个方向上都有变化的特征点,则周围所有的patch都不会很相似。
Moravec会计算每个像素patch和周围patch的SSD最小值作为强度值,取局部强度最大的点作为特征点。
(2)Moravec角点检测示意图
 
3)将moravec角点检测方法公式化
Moravec 在1981年提出Moravec角点检测算子[1],并将它应用于立体匹配。
首先, 计算每个像素点的兴趣值, 即以该像素点为中心, 取一个w*w(如:5x5)的方形窗口, 计算0度、45度、90度、135度四个方向灰度差的平方和, 取其中的最小值作为该像素点的兴趣值。
 

图1- 1 以3x3为例 黑色窗口为I(x,y) 红色窗口为I(x+u,y+v)
其中四种移位 (u,v) = (1,0), (1,1), (0,1), (-1, 1).w(x,y)为方形二值窗口,若像素点在窗口内,则取值为1, 否则为0。

moravec角点检测步骤:
(1)对于每一个像素点,计算在E(u,v),在我们的算法中,(u,v)的取值是((1,0), (1,1), (0,1), (-1, 1).当然,你自己可以改成(1,0),(1,1),(0,1),(-1,1),(-1,0),(-1,-1),(0,-1),(1,-1) 8种情况
(2)计算最小值对每个位置minValue = min{E(u,v)},其中(u,v) = (1,0), (1,1), (0,1), (-1, 1).
(3)对每个位置minValue 进行判断,是不是大于设定阈值,如果是大于设定阈值,接着判断是不是局部极大值

#pragma comment(lib,"cxcore.lib")
#pragma comment(lib,"cv.lib")
#pragma comment(lib,"highgui.lib")
#pragma comment(lib,"ml.lib")
#pragma comment(lib,"cvcam.lib")
#pragma comment(lib,"cvaux.lib")


#include 
#include 

#include 
#include 
#include 

using namespace std;

int getMoravec(IplImage* src,CvPoint* corners , float threshold)
{

	int winsize=5;//窗口的大小 即 5*5 win[5,5]
	int halfwinsize=winsize/2;
	IplImage* diffDst=cvCreateImage(cvGetSize(src),32,1);
	cvZero(diffDst);


	//float threshold=9500;
	int conersCount=0;
	float maxCornersValue=0;//最大角点值



	int x,y;
	/*

	//滑动窗口
	* * * * *
	* * * * *
	* * 0 * *
	* * * * *
	* * * * *

	//遍历方式如图
	**************
	**************
	**1111111111**
	**1111111111**
	**1111111111**
	**************
	**************
	*/
	for (y=halfwinsize;yheight-halfwinsize;y++)
	{
		for (x=halfwinsize;xwidth-halfwinsize;x++)
		{
			float reaction[4],minVal;

			reaction[0]=0;
			reaction[1]=0;
			reaction[2]=0;	
			reaction[3]=0;
		
			int i;

			//0
			for (i=-halfwinsize;iheight-halfwinsize;y+=halfwinsize)
	{
		for (x=halfwinsize;xwidth-halfwinsize;x+=halfwinsize)
		{

			float max=0;
			int flag=0;
			CvPoint maxLoc;
			maxLoc.x=-1;
			maxLoc.y=-1;

			

			//int halfwinsize=halfwinsize;
			for (int winy=-halfwinsize;winy0)printf("xxxxxx");

					if (value>max)
					{
						
						max=value;
						flag=1;
						maxLoc.x=x+winx;
						maxLoc.y=y+winy;


						if(max>maxCornersValue)maxCornersValue=value;
						
					}

				}
			}//------------

			if (flag==1 && max>threshold)
			{
				corners[conersCount].x=maxLoc.x;
				corners[conersCount].y=maxLoc.y;
				conersCount++;
			}

		}

	}//end for


	printf("图像中最大角点值=%f",maxCornersValue);
	return conersCount;
}

int main()
{

	IplImage* src=cvLoadImage("img//Moravec.jpg",CV_LOAD_IMAGE_GRAYSCALE);

	CvPoint* corners;
	int cornersCount;
	corners=(CvPoint*)malloc(sizeof(CvPoint)*9000);

	int count=getMoravec(src,corners,6500);


	IplImage* show=cvCreateImage(cvGetSize(src),8,3);
	cvCvtColor(src,show,CV_GRAY2BGR);

	for (int i=0;i



Moravec角点检测算法原理_第1张图片






你可能感兴趣的:(Moravec角点检测算法原理)