資源簡介
開發環境為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?<“圖像特征點個數:“?<
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? {
for?(int?j?=?r;?j {
int?V1?V2?V3?V4;
V1?=?V2?=?V3?=?V4?=?0;
//計算水平方向窗內興趣值
for?(int?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? 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? 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? 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;
//利用
評論
共有 條評論