Harris角点检测
代码示例一:
#include<opencv2/opencv.hpp>
using namespace cv;
int main(){
Mat src = imread();
imshow("原始图", src);
//进行Harris角点检测找出角点
Mat cornerStrength;
cornerHarris(src, cornerStrength, , , 0.01);
//对灰度图进行阈值操作,得到二值图并显示
Mat harrisCorner;
threshold(cornerStrength, harrisCorner, , THRESH_BINARY);
imshow("二值效果图",harrisCorner);
waitKey();
;
}
效果:

代码示例二:
#include<opencv2/opencv.hpp>
using namespace cv;
#define WINDOW_NAME1 "窗口1"
#define WINDOW_NAME2 "窗口2"
Mat src,srcClone,gray;
;
;
//函数声明
void onCornerHarris(int, void*);//回调函数
int main(){
src = imread();
imshow("原始图", src);
srcClone = src.clone();
cvtColor(srcClone, gray, COLOR_BGR2GRAY);
//创建窗口和滚动条
namedWindow(WINDOW_NAME1, WINDOW_AUTOSIZE);
createTrackbar("阈值:", WINDOW_NAME1, &thresh, max_thresh, onCornerHarris);
//调用一次回调函数进行初始化
onCornerHarris(, );
waitKey();
;
}
void onCornerHarris(int, void*){
Mat dstImage;//目标图
Mat normImage;//归一化后的图
Mat scaledImage;//线性变换后的8位无符号整形图
//初始化
dstImage = Mat::zeros(src.size(), CV_32FC1);
srcClone = src.clone();
//进行角点检测
cornerHarris(gray, dstImage, , , 0.04, BORDER_DEFAULT);
//归一化与转换
normalize(dstImage, normImage, , , NORM_MINMAX, CV_32FC1, Mat());
convertScaleAbs(normImage, scaledImage);
//绘制:将检测到的,符合阈值条件的角点绘制出来
; j < normImage.rows; j++){
; i < normImage.cols; i++){
){
circle(srcClone, Point(i, j), , Scalar(, , ), , , );
circle(scaledImage, Point(i, j), , Scalar(, , ), , , );
}
}
}
imshow(WINDOW_NAME1, srcClone);
imshow(WINDOW_NAME2, scaledImage);
}
效果:

代码示例三:
#include<opencv2/opencv.hpp>
using namespace cv;
#include<vector>
using namespace std;
class HarrisDetector{
private:
//表示角点强度的32位浮点图像
Mat cornerStrength;
//阈值化后的32位浮点图像
Mat cornerTh;
//局部极大值图像(内部)
Mat localMax;
//导数平滑的相邻像素的尺寸
int neighbourhood;
//梯度计算的孔径大小
int aperture;
//Harris参数
double k;
//harris计算的最大强度
double maxStrength;
//计算得到的阈值(内部)
double threshold;
//非极大值抑制的相邻像素的尺寸
int nonMaxSize;
//非极大值抑制的核
Mat kernel;
public:
HarrisDetector() :neighbourhood(), aperture(),
k(0.01), maxStrength(0.0),
threshold(){
//创建非极大值抑制的核
}
void detect(const Mat& image){
//harris计算
cornerHarris(image, cornerStrength, neighbourhood, aperture, k);
//内部阈值计算
double minStrength;//未使用
minMaxLoc(cornerStrength, &minStrength, &maxStrength);
//局部极大值检测
Mat dilated;//临时图像
dilate(cornerStrength, dilated, Mat());
compare(cornerStrength, dilated, localMax, CMP_EQ);
}
Mat getCornerMap(double qualityLevel){
Mat cornerMap;
//对角点图像进行阈值化
this->threshold = qualityLevel*maxStrength;
cv::threshold(cornerStrength, cornerTh, threshold, , THRESH_BINARY);
//转换为8位图像
cornerTh.convertTo(cornerMap,CV_8U);
//非极大值抑制
bitwise_and(cornerMap, localMax, cornerMap);
return cornerMap;
}
void getCorners(vector<cv::Point>& points,double qualityLevel){
//得到角点图
cv::Mat cornerMap = getCornerMap(qualityLevel);
getCorners(points, cornerMap);
}
void getCorners(vector<cv::Point>& points, const Mat& cornerMap){
//遍历像素得到所有特征
; y < cornerMap.rows; y++){
const uchar* rowPtr = cornerMap.ptr <uchar>(y);
; x < cornerMap.cols; x++){
//如果是特征点
if (rowPtr[x]){
points.push_back(cv::Point(x, y));
}
}
}
}
//在特征点的位置绘制圆
,,), , ){
vector<cv::Point>::const_iterator it = points.begin();
while (it != points.end()){
cv::circle(image, *it, radius, color, thickness);
++it;
}
}
};
int main(){
Mat src = imread();
//HarrisDetector类使用方式
HarrisDetector harris;
harris.detect(src);
std::vector<cv::Point> pts;
harris.getCorners(pts, 0.1);
harris.drawOnImage(src, pts);
imshow("result", src);
waitKey();
}
效果:

Harris角点检测的更多相关文章
- Harris角点检测算法优化
Harris角点检测算法优化 一.综述 用 Harris 算法进行检测,有三点不足:(1 )该算法不具有尺度不变性:(2 )该算法提取的角点是像素级的:(3 )该算法检测时间不是很令人满意. 基于以上 ...
- Harris 角点检测
一 .Motivation 对于做图像处理的人来说,Harris角点检测肯定听过,1988年发表的文章"A combined corner and edge detector"描述 ...
- Harris角点检测算原理
主要参考了:http://blog.csdn.net/yudingjun0611/article/details/7991601 Harris角点检测算子 本文将该文拷贝了过来,并做了一些数学方面的 ...
- Harris角点检测原理分析
看到一篇从数学意义上讲解Harris角点检测很透彻的文章,转载自:http://blog.csdn.net/newthinker_wei/article/details/45603583 主要参考了: ...
- cv2.cornerHarris()详解 python+OpenCV 中的 Harris 角点检测
参考文献----------OpenCV-Python-Toturial-中文版.pdf 参考博客----------http://www.bubuko.com/infodetail-2498014. ...
- Opencv学习笔记------Harris角点检测
image算法测试iteratoralgorithmfeatures 原创文章,转载请注明出处:http://blog.csdn.net/crzy_sparrow/article/details/73 ...
- harris角点检测的简要总结
目录 1. 概述相关 2. 原理详解 1) 算法思想 2) 数学模型 3) 优化推导 3. 具体实现 1) 详细步骤 2) 最终实现 4. 参考文献 1. 概述相关 harris角点检测是一种特征提取 ...
- OpenCV-Python:Harris角点检测与Shi-Tomasi角点检测
一.Harris角点检测 原理: 角点特性:向任何方向移动变换都很大. Chris_Harris 和 Mike_Stephens 早在 1988 年的文章<A CombinedCorner an ...
- 第十一节、Harris角点检测原理(附源码)
OpenCV可以检测图像的主要特征,然后提取这些特征.使其成为图像描述符,这类似于人的眼睛和大脑.这些图像特征可作为图像搜索的数据库.此外,人们可以利用这些关键点将图像拼接起来,组成一个更大的图像,比 ...
随机推荐
- 如何使用AssemblyInfo中的Attribute?
问题:在生成的项目文件中有个文件:Properties ->AssemblyInfo.cs,可以为程序添加一些属性.主要用来设定生成的有关程序集的常规信息dll文件的一些参数,下面是默认的Ass ...
- 07 Linux su和sudo命令的区别
一. 使用 su 命令临时切换用户身份 1.su 的适用条件和威力 su命令就是切换用户的工具,怎么理解呢?比如我们以普通用户beinan登录的,但要添加用户任务,执行useradd ,beinan用 ...
- 创建MySQL 用户
create user 'lixianming'@'localhost' identified by 'lxm123456'; grant all on art.* to 'lixianming'@' ...
- python---sys
简介 sys模块用于提供对python解释器的相关操作 sys.argv 命令行参数List,第一个元素是程序本身路径 sys.modules 返回系统导入的模块字段,key是模块名,value是模块 ...
- Android总结篇系列:Activity Intent Flags及Task相关属性
同上文一样,本文主要引用自网上现有博文,并加上一些自己的理解,在此感谢原作者. 原文地址: http://blog.csdn.net/liuhe688/article/details/6761337 ...
- [HTML] CSS3 圆角
使用 CSS3 border-radius 属性,你可以给任何元素制作 "圆角". CSS3 border-radius 属性 使用 CSS3 border-radius 属性,你 ...
- (转)MyEclipse自动生成Hibernate实体类, oracle篇
转自http://blog.csdn.net/hejinwei_1987/article/details/9465529 1.打开 windows -> Open Perspective -&g ...
- QlikView TEXT控件固定显示图片
QlikView 的Text控件不仅可以用来展示文本也可以用来展示图片. 数据表 2个列,一个是 关联字段(Country),另外一个保存图片物理路径. TEXT控件固定显示图片 ,编辑控件表达式 = ...
- ArcGIS生成根据点图层生成等值面并减小栅格锯齿的操作步骤
一.打开ArcMAP并加载上相应的点图层和边界面图层 二.ArcToolbox--Spatial Analyst工具--差值分析--克里金法(根据不同的情况选择不同的算法,这次的处理实际上使用的是样条 ...
- idea 到myeclipse
在上一篇博客使用maven进行开发过程管理之准备篇中提到了maven的基本概念.IT男罗书全觉得概念我是懂了,但是那些东西似乎离我很远啊.先开发再说吧, 于是IT男罗书全就在svn上取了源代码,并开始 ...