资源简介

使用C++实现莫拉维克算子特征点提取的算法。算法效率高。便于调用。

资源截图

代码片段和文件信息

#include “stdafx.h“
#include “Moravec.h“
#include   
#include   

CMoravec::CMoravec()
{
kSize = 5;
threshold = 20000;
}


CMoravec::~CMoravec()
{
}

//***********moravec角点检测函数*******************  
void CMoravec::Moravec(Mat srcImage Mat srcImgColor){

//角点检测的结果图  
resMorMat = srcImage.clone();
//存储兴趣点位置
Interest = Mat::ones(srcImage.rows srcImage.cols CV_8U);
int r = kSize / 2;
//获取图像的高和宽  
const int nRows = srcImage.rows;
const int nCols = srcImage.cols;

int nCount = 0;
//保存角点的坐标  
CvPoint *pPoint = new CvPoint[nRows*nCols];
//遍历图像  
for (int i = r; i < srcImage.rows - r; i++)
{
for (int j = r; j < srcImage.cols - r; j++)
{
int wV1 wV2 wV3 wV4;
wV1 = wV2 = wV3 = wV4 = 0;
//计算水平方向窗内的兴趣值  
for (int k = -r; k <= r; k++)
{
for (int m = -r; m <= r; m++)
{
//判断移动的过程中是否越界,越界的话就跳过当前的循环,以免出错  
int a = i + k;
int b = j + m + 1;
if (b >= srcImage.cols)
{
continue;
}
wV1 += (srcImage.at(i + k j + m + 1) - srcImage.at(i + k j + m))
*(srcImage.at(i + k j + m + 1) - srcImage.at(i + k j + m));
}
}

//计算垂直方向窗内的兴趣值  
for (int k = -r; k <= r; k++)
{
for (int m = -r; m <= r; m++)
{
int a = i + k + 1;
int b = j + m;
if (a >= srcImage.rows)
{
continue;
}
wV2 += (srcImage.at(i + k + 1 j + m) - srcImage.at(i + k j + m))
*(srcImage.at(i + k + 1 j + m) - srcImage.at(i + k j + m));
}
}

//计算45°方向窗内的兴趣值  
for (int k = -r; k <= r; k++)
{
for (int m = -r; m <= r; m++)
{
int a = i + k + 1;
int b = j + m + 1;
if (a >= srcImage.rows || b >= srcImage.cols)
{
continue;
}
wV3 += (srcImage.at(i + k + 1 j + m + 1) - srcImage.at(i + k j + m))
*(srcImage.at(i + k + 1 j + m + 1) - srcImage.at(i + k j + m));
}
}

//计算135°方向窗内的兴趣值  
for (int k = -r; k <= r; k++)
{
for (int m = -r; m <= r; m++)
{
int a = i + k + 1;
int b = j + m - 1;
if (a >= srcImage.rows || b < 0)
{
continue;
}
wV4 += (srcImage.at(a b) - srcImage.at(i + k j + m))
*(srcImage.at(a b) - srcImage.at(i + k j + m));
}
}
int  value = min(min(wV1 wV2) min(wV3 wV4));
//如果兴趣值大于阈值,那么将坐标存入数组中  
if (value > threshold)
{
pPoint[nCount] = cvPoint(j i);
nCount++;
Interest.at(i j) = 0;
}
}
}
FeatureNum = nCount;
for (int i = 0; i < nCount; i++)
{
circle(resMorMat pPoint[i] 5 Scalar(255 0 0)180);
}
}

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       2945  2017-12-30 01:02  莫拉维克角点检测\Moravec.cpp

     文件        459  2017-12-30 00:04  莫拉维克角点检测\Moravec.h

     目录          0  2018-12-02 14:56  莫拉维克角点检测

----------- ---------  ---------- -----  ----

                 3404                    3


评论

共有 条评论