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 = https://www.it610.com/article/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=https://www.it610.com/article/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;
i0)printf("xxxxxx");
if (value>max)
{max=value;
flag=1;
maxLoc.x=x+winx;
maxLoc.y=y+winy;
if(max>maxCornersValue)maxCornersValue=https://www.it610.com/article/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=https://www.it610.com/article/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角点检测算法原理】
文章图片
推荐阅读
- Java|Java OpenCV图像处理之SIFT角点检测详解
- 2018-09-03(李克富视角点评训练营81/90)|2018-09-03(李克富视角点评训练营81/90) 那只蛙从“井”爬出来又进入了“隧道”
- JS常见数组操作补充
- 霍夫变换与直线检测
- hough变换检测的matlab程序
- Android智能手表MMI测试检测系统
- 通过人工大脑刺激来检测神经网络中的后门
- 佐伊挖财(6个公式,检测你的家庭财富是否安全())
- PHP|PHP 扩展开发检测清单(扩展开发必读)
- 做核酸检测