第22集 Moravec角点检测

步骤1:算出0,45,90,135四个方向上变化的最小值的平方,并且记录在结果图像中

步骤2:求结果图像的局部最大值,并且和阀值对比,大于阀值的保存该点的坐标位置:cvCreateMemStorage ,cvCreateSeq ,cvSeqPush

步骤3:读取角点的坐标,并且在图像上画出:cvGetSeqElem,cvCircle

程序:

#include "cv.h"
#include "cxcore.h"
#include "highgui.h"
#include <iostream>
int CornerDetect(IplImage *src,CvSeq *Corner,int TestWidth,int TestHeight,int Threshold)
{
int CornerNum=0;
int HalfTestHeight=TestHeight/2;
int HalfTestWidth=TestWidth/2;
int ResultWidth=src->width;
int ResultHeight=src->height;
IplImage* ResultImage=cvCreateImage(cvSize(ResultWidth,ResultHeight),32,1);
cvZero(ResultImage);
//计算结果保存在ResultImage中
int i=0;
for(int y=HalfTestHeight;y<src->height-2*HalfTestHeight;y++)
{
for(int x=HalfTestWidth;x<src->width-2*HalfTestWidth;x++)
{
float Result[4]={0};
//0度结果
for(int winx=-HalfTestWidth;winx<HalfTestWidth;winx++)
{
Result[0]=Result[0]+pow(cvGetReal2D(src,y,x+winx)-cvGetReal2D(src,y,x+winx+1),2);
}
//45度结果
for(int winx=-HalfTestWidth;winx<HalfTestWidth;winx++)
{
Result[1]=Result[1]+pow(cvGetReal2D(src,y+winx,x+winx)-cvGetReal2D(src,y+winx+1,x+winx+1),2);
}
//90度结果
for(int winx=-HalfTestWidth;winx<HalfTestWidth;winx++)
{
Result[2]=Result[2]+pow(cvGetReal2D(src,y+winx,x)-cvGetReal2D(src,y+winx+1,x),2);
}
//135度结果
for(int winx=-HalfTestWidth;winx<HalfTestWidth;winx++)
{
Result[3]=Result[3]+pow(cvGetReal2D(src,y+winx,x-winx)-cvGetReal2D(src,y+winx+1,x-winx-1),2);
}
float min=Result[0]<Result[1]?Result[0]:Result[1];
min=Result[2]<min?Result[2]:min;
min=Result[3]<min?Result[3]:min;
cvSetReal2D(ResultImage,y,x,min);
}
}
std::cout<<"dfsaf"<<std::endl;
//计算交点坐标
double max=0;
CvPoint MaxPoint;
for(int y=HalfTestHeight;y<ResultImage->height-HalfTestHeight;y+=HalfTestHeight)
{
for(int x=HalfTestWidth;x<ResultImage->width-HalfTestWidth;x+=HalfTestWidth)
{
for(int winx=-HalfTestWidth;winx<=HalfTestWidth;winx++)
{
for(int winy=-HalfTestHeight;winy<=HalfTestHeight;winy++)
{
double current=cvGetReal2D(ResultImage,y+winy,x+winx);
if(max<current)
{
max=current;
MaxPoint.x=x;
MaxPoint.y=y;
}
}
}
if(max>Threshold)
{
cvSeqPush(Corner,&MaxPoint);
CornerNum++;
std::cout<<"max"<<max<<std::endl;
}
MaxPoint.x=0;
MaxPoint.y=0;
max=0;
}
}
std::cout<<"CornerNum"<<CornerNum<<std::endl;
return CornerNum;
}
int CornerDetection(int argc,char** argv)
{
IplImage* src=cvLoadImage("e:\\picture\\FivePointStar.jpg",0);
cvNamedWindow("FivePointStar");
cvShowImage("FivePointStar",src);
int TestWidth=5;
int TestHeight=5;
CvMemStorage* storage=cvCreateMemStorage(0);
CvSeq* CornerSeq=cvCreateSeq(0,sizeof(CvSeq),sizeof(CvPoint),storage);
int CornerNum=CornerDetect(src,CornerSeq,TestWidth,TestHeight,65020);
IplImage* ResultImage=cvCreateImage(cvGetSize(src),8,3);
cvZero(ResultImage);
cvCvtColor(src,ResultImage,CV_GRAY2BGR);
for(int i=0;i<CornerNum;i++)
{
CvPoint* CornerPoint=(CvPoint*)cvGetSeqElem(CornerSeq,i);
cvCircle(ResultImage,*CornerPoint,5,cvScalar(0,0,255,NULL));
}
cvNamedWindow("ResultImage");
cvShowImage("ResultImage",ResultImage);
cvWaitKey(0);
cvDestroyWindow("FivePointStar");
cvDestroyWindow("ResultImage");
cvReleaseImage(&src);
cvReleaseImage(&ResultImage);
return 0;
}

第22集 Moravec角点检测

时间: 2024-10-28 21:35:07

第22集 Moravec角点检测的相关文章

Opencv图像识别从零到精通(33)----moravec角点、harris角点

一.角点 图像处理和与计算机视觉领域,兴趣点(interest points),或称作关键点(keypoints).特征点(feature points) 被大量用于解决物体识别,图像识别.图像匹配.视觉跟踪.三维重建等一系列的问题.我们不再观察整幅图,而是选择某些特殊的点,然后对他们进行局部有的放矢的分析.如果能检测到足够多的这种点,同时他们的区分度很高,并且可以精确定位稳定的特征,那么这个方法就有使用价值. 图像特征类型可以被分为如下三种: <1>边缘                   

Harris角点及Shi-Tomasi角点检测(转)

一.角点定义 有定义角点的几段话: 1.角点检测(Corner Detection)是计算机视觉系统中用来获得图像特征的一种方法,广泛应用于运动检测.图像匹配.视频跟踪.三维建模和目标识别等领域中.也称为特征点检测. 角点通常被定义为两条边的交点,更严格的说,角点的局部邻域应该具有两个不同区域的不同方向的边界.而实际应用中,大多数所谓的角点检测方法检测的是拥有特定特征的图像点,而不仅仅是"角点".这些特征点在图像中有具体的坐标,并具有某些数学特征,如局部最大或最小灰度.某些梯度特征等.

Harris角点检测学习

1.角点的定义与性质 角点是一种局部特征,具有旋转不变性和不随光照条件变化而变化的特点,一般将图像中曲率足够高或者曲率变化明显的点作为角点.检测得到的角点特征通常用于图像匹配.目标跟踪.运动估计等方面. 2.Harris角点 1)定性描述 该算法中,将图像分为平坦区域.边缘.角点三部分.平坦区域中像素灰度在各个方向上变换都很小,边缘上的像素灰度在某个方向变化很大,但是在另一些方向变化很小:位于角点上的像素灰度则在各个方向上的变化都比较大.这是通过人眼观察得到的直观感受. 2)量化的数学表达 不同

形态学滤波(3):使用形态学滤波对图像进行边缘及角点检测.

1 #include<opencv2/opencv.hpp> 2 #include<iostream> 3 4 using namespace std; 5 using namespace cv; 6 7 //首先定义MorphoFeatures类,我们将使用它来检测图像特征 8 class MorphoFeatures { 9 private: 10 int threShold; //用于生成二值图像的阈值 11 Mat cross; //角点检测中用到的结构元素 12 Mat

15、角点检测之Harris角点检测

一.引言:关于兴趣点(interest points) 在图像处理和与计算机视觉领域,兴趣点(interest points),或称作关键点(keypoints).特征点(feature points) 被大量用于解决物体识别,图像识别.图像匹配.视觉跟踪.三维重建等一系列的问题.我们不再观察整幅图,而是选择某些特殊的点,然后对他们进行局部有的放矢的分析.如果能检测到足够多的这种点,同时他们的区分度很高,并且可以精确定位稳定的特征,那么这个方法就有使用价值. 图像特征类型可以被分为如下三种: <

【opencv入门】角点检测之Harris角点检测

一.引言:关于兴趣点(interest points) 在图像处理和与计算机视觉领域,兴趣点(interest points),或称作关键点(keypoints).特征点(feature points) 被大量用于解决物体识别,图像识别.图像匹配.视觉跟踪.三维重建等一系列的问题.我们不再观察整幅图,而是选择某些特殊的点,然后对他们进行局部有的放矢的分析.如果能检测到足够多的这种点,同时他们的区分度很高,并且可以精确定位稳定的特征,那么这个方法就有使用价值. 图像特征类型可以被分为如下三种: <

33、【opencv入门】角点检测之Harris角点检测

一.引言:关于兴趣点(interest points) 在图像处理和与计算机视觉领域,兴趣点(interest points),或称作关键点(keypoints).特征点(feature points) 被大量用于解决物体识别,图像识别.图像匹配.视觉跟踪.三维重建等一系列的问题.我们不再观察整幅图,而是选择某些特殊的点,然后对他们进行局部有的放矢的分析.如果能检测到足够多的这种点,同时他们的区分度很高,并且可以精确定位稳定的特征,那么这个方法就有使用价值. 图像特征类型可以被分为如下三种: <

OpenCV3入门(十二)角点检测

1.角点介绍 角点检测(Corner Detection)是计算机视觉系统中用来获得图像特征的一种方法,广泛应用于运动检测.图像匹配.视频跟踪.三维建模和目标识别等领域中,也称为特征点检测.在图像中角点是一个重要的局部特征,它决定了图像中关键区域的形状,体现了图像中重要的特征信息.目前,角点检测方法主要有2大类: 1)基于图像边缘轮廓特征的方法. 2)基于图像灰度信息的方法.此方法主要通过计算曲率及梯度进行角点检测,通过计算边缘的曲率来判断角点的存在性.典型代表有Harris算法.Susan算法

Harris角点检测原理及实现

一.原理 二.实现 close all; clear all; I=imread('test.tif'); [posX,posY]=harris(I); figure;imshow(I); hold on; plot(posX, posY, 'g*'); function [posX,posY]=harris(I) %Harris角点检测 %I:输入图像 %posX:角点X坐标 %posY:角点Y坐标 I=double(I); [m,n]=size(I); hx=[-1,0,1;-1,0,1;-