• 大小: 7KB
    文件类型: .cpp
    金币: 1
    下载: 0 次
    发布日期: 2021-06-04
  • 语言: C/C++
  • 标签: Harris算子  opencv3.2  

资源简介

开发环境为vs2015 debug x64+opencv3.2。资源为一个源.cpp文件,三个算子分别写成了三个函数。下载前请先看一下环境和opencv版本是否一致。

资源截图

代码片段和文件信息

#include 
#include 

using namespace std;
using namespace cv;

void Moravec(InputArray image vector& keypoints int threshold);       //Moravec算子提取特征点函数
void Forstner(InputArray image vector& keypoints);                     //Forstner算子提取特征点函数
void Harris(InputArray image vector& keypoints);                       //Harris算子提取特征点函数

int main()
{
Mat img = imread(“D:/测试图像/7.jpg“ IMREAD_GRAYSCALE);              //读取图像,可更改路径。IMREAD_GRAYSCALE表示读取灰度图像
Mat output;
vectorkey;                    //用于保存关键点

// Moravec(img key 10000);               //调用Moravec函数提取特征点并保存到Key中
// Forstner(img key);                     //调用Forstner函数提取特征点并保存到Key中
Harris(img key);                       //调用Harris函数提取特征点并保存到Key中

cout << “图像特征点个数:“ << key.size() << endl;           //输出提取的特征点的个数

drawKeypoints(img key output Scalar::all(0));           //绘制特征点,第四个参数可改变绘制的特征点的颜色

imshow(“图像提取的特征点“ output);                        //显示特征点

waitKey(0);
return 0;
}


void Moravec(InputArray image vector& keypoints int threshold)
{
Mat img = image.getMat();
int kSize = 5;                         //窗口大小

int r = kSize / 2;

for (int i = r; i < img.rows - r; i++)
{
for (int j = r; j {
int V1 V2 V3 V4;
V1 = V2 = V3 = V4 = 0;

//计算水平方向窗内兴趣值
for (int k = -r; k < r; k++)
V1 += (img.at(i j + k) - img.at(i j + k + 1))*(img.at(i j + k) - img.at(i j + k + 1));

//计算垂直方向窗内兴趣值
for (int k = -r; k < r; k++)
V2 += (img.at(i + k j) - img.at(i + k + 1 j))*(img.at(i + k j) - img.at(i + k + 1 j));

//计算45度方向窗内兴趣值
for (int k = -r; k < r; k++)
V3 += (img.at(i + k j + k) - img.at(i + k + 1 j + k + 1))*(img.at(i + k j + k) - img.at(i + k + 1 j + k + 1));

//计算135度方向窗内兴趣值
for (int k = -r; k < r; k++)
V4 += (img.at(i + k j - k) - img.at(i + k + 1 j - k - 1))*(img.at(i + k j - k) - img.at(i + k + 1 j - k - 1));

//取其中的最小值作为该像素点的最终兴趣值
int value = min(min(V1 V2) min(V3 V4));

//若兴趣值大于阈值,保存点的坐标
if (value > threshold)
{
keypoints.push_back(KeyPoint((float)j (float)i 2));
}
}
}
}

void Forstner(InputArray image vector& keypoints)             //简化版Forstner算法
{
Mat img = image.getMat();

int ksize = 3;           //窗口大小
int r = ksize / 2;
double N[4] = { 0.0 };   //协方差阵
double q = 0.0 w = 0.0; //兴趣值q和w,q是像素对应误差椭圆的圆度,w是像素的权
double Tq = 0.5;         //阈值

const int nRows = img.rows;
const int nCols = img.cols;

Mat Prepoint = Mat::zeros(img.size() CV_8UC1);          //初选点矩阵初始化为0,如果某点被选为初选点,则该点位置在此数组中赋为1.
Mat Weipoint = Mat::zeros(img.size() CV_8UC1);          //权矩阵,存放初选点的权w,初始化为0。
Mat Flagpoint = Mat::zeros(img.size() CV_8UC1);

int D[4] = { 0 };
int threshold = 65;
//利用

评论

共有 条评论