资源简介
使用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
评论
共有 条评论