#include<iostream>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<imgproc/imgproc.hpp>
using namespace std;
using namespace cv;
class HarrisDetector{
private:
//表示角点强度的32位浮点图像
Mat cornerStrength;
//表示阈值化后角度的32位浮点图像
Mat cornerTh;
//局部极大值图像(内部)
Mat localMax;
//导数平滑的相邻像素的尺寸
int neighbourhood;
//梯度计算的孔径大小
int aperture;
//Harris参数
double k;
//阈值计算的最大强度
double maxStrength;
//计算得到的阈值(内部)
double thresholdValue;
//非极大值抑制的相邻像素的尺寸
int nonMaxSize;
//非极大值抑制的核
Mat kernel;
public:
HarrisDetector() :neighbourhood(3), aperture(3), k(0.01), maxStrength(0.0), thresholdValue(0.01), nonMaxSize(3){};
//创建非极大值抑制的核
void setLocalMaxWindowsize(int nonMaxSize){
this->nonMaxSize = nonMaxSize;
}
//计算Harris角点
void detect(const Mat&image){
//Harris计算
cornerHarris(image,
cornerStrength,
neighbourhood, //neighbourhood Size
aperture, //滤波器的孔径大小
k); //Harris参数
//内部阈值计算
double minStrength; //未使用
minMaxLoc(cornerStrength, &minStrength, &maxStrength);
//局部极大值检测
Mat dilated; //临时图像
dilate(cornerStrength, dilated, Mat());
compare(cornerStrength, dilated, localMax, CMP_EQ);
}
//基于特定的阈值获取特征点
//由Harris值获取角点图
Mat getCornerMap(double qualityLevel){
Mat cornerMap;
//对角点图像进行阈值化
thresholdValue = qualityLevel*maxStrength;
threshold(cornerStrength, cornerTh, thresholdValue, 255, THRESH_BINARY);
//转换为8位图像
cornerTh.convertTo(cornerMap, CV_8U);
//非极大值抑制
bitwise_and(cornerMap, localMax, cornerMap);
return cornerMap;
}
//由Harris值得到特征点
void getCorners(vector<Point>&points, double qualityLevel){
//得到角点图
Mat cornerMap = getCornerMap(qualityLevel);
//得到角点
getCorners(points, cornerMap);
}
//由角点图获取特征点
void getCorners(vector<Point>&points, const Mat&cornerMap){
//遍历像素得到所有特征
for (int y = 0; y < cornerMap.rows; y++)
{
const uchar*rowPtr = cornerMap.ptr<uchar>(y);
for (int x = 0; x < cornerMap.cols; x++)
{
//如果是特征点
if (rowPtr[x])
{
points.push_back(Point(x, y));
}
}
}
}
void drawOnImage(Mat&image, const vector<Point>&points, Scalar color = Scalar(255, 255, 255), int radius = 3, int thickness = 2){
vector<Point>::const_iterator it = points.begin();
//对于所有角点
while (it != points.end())
{
//绘制一个圆
circle(image, *it, radius, color, thickness);
++it;
}
}
};
int main823(){
Mat image = cvLoadImage("church01.jpg");
Mat grayImage;
cvtColor(image, grayImage, CV_BGR2GRAY);
//创建Harris检测器的对象
HarrisDetector harris;
// 改进的harris角点检测方法
std::vector<cv::Point> corners;
cv::goodFeaturesToTrack(grayImage, corners,
500, //返回的最大特征点数目
0.01, // 质量等级,这里是0.01*max(min(e1,e2)),e1,e2是harris矩阵的特征值
10); // 两个角点之间的距离容忍度
harris.drawOnImage(grayImage, corners); //标记角点
namedWindow("harris");
imshow("harris", grayImage);
waitKey(0);
return 0;
}
没有合适的资源?快使用搜索试试~ 我知道了~
【OpenCV学习笔记 011】检测并匹配兴趣点
共17个文件
cpp:7个
jpg:3个
log:2个
3星 · 超过75%的资源 需积分: 16 37 下载量 69 浏览量
2016-10-01
22:59:37
上传
评论
收藏 2.98MB RAR 举报
温馨提示
爱分享、爱极客的编程怪兽--DaveBobo 博文 《【OpenCV学习笔记 011】检测并匹配兴趣点》 博文链接: http://blog.csdn.net/davebobo/article/details/52598850 OpenCV版本:2.4.9
资源推荐
资源详情
资源评论
收起资源包目录
【OpenCV学习笔记 011】检测并匹配兴趣点.rar (17个子文件)
【OpenCV学习笔记 011】检测并匹配兴趣点
【OpenCV学习笔记 011】检测并匹配兴趣点.v12.suo 45KB
Debug
【OpenCV学习笔记 011】检测并匹配兴趣点.sln 1KB
【OpenCV学习笔记 011】检测并匹配兴趣点.sdf 13.5MB
【OpenCV学习笔记 011】检测并匹配兴趣点
church01.jpg 121KB
Debug
【OpenCV学习笔记 011】检测并匹配兴趣点.log 95B
【OpenCV学.CC9EF194.tlog
【OpenCV学习笔记 011】检测并匹配兴趣点.Build.CppClean.log 4KB
8.2检测Harris角点实验二.cpp 3KB
8.3检测FAST特征.cpp 740B
8.2检测Harris角点实验三.cpp 3KB
8.4检测尺度不变的SURF特征实验二.cpp 897B
8.5描述SURF特征.cpp 1KB
【OpenCV学习笔记 011】检测并匹配兴趣点.vcxproj.filters 2KB
church02.jpg 122KB
church03.jpg 119KB
8.2检测Harris角点实验一.cpp 752B
【OpenCV学习笔记 011】检测并匹配兴趣点.vcxproj 5KB
8.4检测尺度不变的SURF特征实验一.cpp 848B
共 17 条
- 1
资源评论
- usbfans2016-10-25总是提示少一个dll,工程不好用,vs2015。
DaveBobo
- 粉丝: 741
- 资源: 52
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功