资源简介
开发环境为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;
//利用
相关资源
- Bresenham画圆算法和中点圆整数优化算
- aloha算法仿真实验
- 计算机图形学直线段的扫描转换C++实
- TI SHA_256 源码及例程
- ChartCtrl_source
- Bresenham直线算法的C++实现
- MFC美化-SkinSharp库使用方法和经典例程
- PyQt5:pyCharts 绘制饼图
- C语言 3DES、AES、RC6、TEA、RSA、MD5、S
- VS2010 C++窗口应用程序窗口之间传递参
- SHA-1算法实现源代码
- moravec算子c++代码
- ATSHA204的C语言代码
- MD5-SHA1-SHA256算法C源码
- alphabeta剪枝算法的C++实现下棋程序
- MFC mschart绘制曲线、饼图、柱状小程序
- 传热学非稳态热传导问题网格划分数
- c++之sha1类
- PBKDF2_HMac_SHA1哈希算法
- c语言实现获取文件的md5哈希值
- GDAL进行shapefile数据栅格化
- MFC读取SHP文件
- 完全Bresenham算法生成椭圆
- ChartCtrl_doxygen
- ChartCtrl_demo
- 使用HackRF在windows和linux下扫描GSM频道
- C语言仿真的aloha算法
- hmacSha256Test.rar
- 20多个常用的Hash算法C++ 实现
- 基于OpenDDS的MFC界面程序
评论
共有 条评论