资料harris角点检测原理步骤说明文档格式.docx
- 文档编号:16091741
- 上传时间:2022-11-19
- 格式:DOCX
- 页数:10
- 大小:173.10KB
资料harris角点检测原理步骤说明文档格式.docx
《资料harris角点检测原理步骤说明文档格式.docx》由会员分享,可在线阅读,更多相关《资料harris角点检测原理步骤说明文档格式.docx(10页珍藏版)》请在冰豆网上搜索。
opencv2/opencv.hpp"
4.
5.classharris
6.{
7.private:
8.cv:
:
MatcornerStrength;
//opencvharris函数检测结果,也就是每个像素的角点
响应函数值
9.cv:
MatcornerTh;
//cornerStrength阈值化的结果10.cv:
MatlocalMax;
//局部最大值结果11.intneighbourhood;
//邻域窗口大小12.intaperture;
//sobel边缘检测窗口大小(sobel获取各像素点x,y方向的灰度导
数)
13.doublek;
14.doublemaxStrength;
//角点响应函数最大值15.doublethreshold;
//阈值除去响应小的值16.intnonMaxSize;
//这里采用默认的3,就是最大值抑制的邻域窗口大小
17.cv:
Matkernel;
//最大值抑制的核,这里也就是膨胀用到的核
18.public:
19.harris():
neighbourhood(3),aperture(3),k(0.01),maxStrength(0.0),threshold(0.01)
nonMaxSize(3){
20.
21.};
22.
23.voidsetLocalMaxWindowsize(intnonMaxSize){24.this->
nonMaxSize=nonMaxSize;
25.};
26.
27.//计算角点响应函数以及非最大值抑制28.voiddetect(constcv:
Mat&
image){29.//opencv自带的角点响应函数计算函数30.cv:
cornerHarris(image,cornerStrength,neighbourhood,aperture,k);
31.doubleminStrength;
32.//计算最大最小响应值
33.cv:
minMaxLoc(cornerStrength,&
minStrength,&
maxStrength);
34.
35.cv:
Matdilated;
36.//默认3*3核膨胀,膨胀之后,除了局部最大值点和原来相同,其它非局部
最大值点被
37.//3*3邻域内的最大值点取代38.cv:
dilate(cornerStrength,dilated,cv:
Mat());
39.//与原图相比,只剩下和原图值相同的点,这些点都是局部最大值点,保存
到localMax
40.cv:
compare(cornerStrength,dilated,localMax,cv:
CMP_EQ);
41.}
42.
43.//获取角点图
44.cv:
MatgetCornerMap(doublequalityLevel){45.cv:
MatcornerMap;
46.//根据角点响应最大值计算阈值47.threshold=qualityLevel*maxStrength;
48.cv:
threshold(cornerStrength,cornerTh,49.threshold,255,cv:
THRESH_BINARY);
50.//转为8-bit图
51.cornerTh.convertTo(cornerMap,CV_8U);
52.//和局部最大值图与,剩下角点局部最大值图,即:
完成非最大值抑制
53.cv:
bitwise_and(cornerMap,localMax,cornerMap);
54.returncornerMap;
55.}
56.
57.voidgetCorners(std:
vector<
cv:
Point>
&
points,58.doublequalityLevel){
59.//获取角点图
60.cv:
MatcornerMap=getCornerMap(qualityLevel);
61.//获取角点
62.getCorners(points,cornerMap);
63.}
64.
65.//遍历全图,获得角点
66.voidgetCorners(std:
points,67.constcv:
Mat&
cornerMap){
68.
69.for(inty=0;
y<
cornerMap.rows;
y++){70.constuchar*rowPtr=cornerMap.ptr<
uchar>
(y);
71.for(intx=0;
x<
cornerMap.cols;
x++){72.//非零点就是角点
73.if(rowPtr[x]){
74.points.push_back(cv:
Point(x,y));
75.}
76.}
77.}
78.}
79.
80.//用圈圈标记角点
81.voiddrawOnImage(cv:
image,82.conststd:
points,83.cv:
Scalarcolor=cv:
Scalar(255,255,255),84.intradius=3,intthickness=2){
85.std:
const_iteratorit=points.begin();
86.while(it!
=points.end()){87.//角点处画圈
88.cv:
circle(image,*it,radius,color,thickness);
89.++it;
90.}
91.}
92.
93.};
94.
95.#endif//HARRIS_H
相关测试代码:
1.cv:
Matimage,image1=cv:
imread("
test.jpg"
);
2.//灰度变换
3.cv:
cvtColor(image1,image,CV_BGR2GRAY);
5.
6.//经典的harris角点方法7.harrisHarris;
8.//计算角点
9.Harris.detect(image);
10.//获得角点
11.std:
pts;
12.Harris.getCorners(pts,0.01);
13.//标记角点
14.Harris.drawOnImage(image,pts);
15.
16.cv:
namedWindow("
harris"
17.cv:
imshow("
image);
18.cv:
waitKey(0);
19.return0;
相关测试结果:
三、改进的Harris角点检测
从经典的Harris角点检测方法不难看出,该算法的稳定性和k有关,而k是个经验值,
不好把握,浮动也有可能较大。
鉴于此,改进的Harris方法()直接计算出两个特征值,
通过比较两个特征值直接分类,这样就不用计算Harris响应函数了。
另一方面,我们不再用非极大值抑制了,而选取容忍距离:
容忍距离内只有一个特征点。
该算法首先选取一个具有最大最小特征值的点(即:
max(min(e1,e2)),e1,e2是harris矩阵的特征值)作为角点,然后依次按照最大最小特征值顺序寻找余下的角点,当然和前一角点距离在容忍距离内的新角点呗忽略。
opencv测试该算法代码如下:
4.//改进的harris角点检测方法
5.std:
corners;
6.cv:
goodFeaturesToTrack(image,corners,
7.200,
8.//角点最大数目
9.0.01,
10.//质量等级,这里是0.01*max(min(e1,e2)),e1,e2是harris矩阵的特征
值
11.10);
12.//两个角点之间的距离容忍度
13.harris().drawOnImage(image,corners);
//标记角点
测试结果如下:
四、FAST角点检测
算法原理比较简单,但实时性很强。
该算法的角点定义为:
若某像素点圆形邻域圆周上有3/4的点和该像素点不同(编程时不超过某阈值th),则认为该点就是候选角点。
opencv更极端,选用半径为3的圆周上(上下左右)四个点,若超过三个点和该像素点不同,则该点为候选角点。
和Harris算法类似,该算法需要非极大值抑制。
opencv代码:
2.cv:
3.//快速角点检测
4.std:
KeyPoint>
keypoints;
5.cv:
FastFeatureDetectorfast(40,true);
6.fast.detect(image,keypoints);
7.cv:
drawKeypoints(image,keypoints,image,cv:
Scalar:
all(255),cv:
DrawMatchesF
lags:
DRAW_OVER_OUTIMG);
五
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 资料 harris 检测 原理 步骤 说明