角点检测(Harris角点检测法)

博主联系方式:
QQ:1540984562
QQ交流群:892023501
群里会有往届的smarters和电赛选手,群里也会不时分享一些有用的资料,有问题可以在群里多问问。

目录

    • 原理讲解
      • 【1】为何选取角点作为特征?
      • 【2】角点的定义:
      • 【3】判断角点的方法:
      • 【4】Harris角点检测法
    • 示例
      • Opencv自带函数:cornerHarris()函数
      • 示例程序1
      • 示例程序2

原理讲解

【1】为何选取角点作为特征?

角点是一种局部特征。
1
角落上的可区分性特别强,边缘次之,平滑区域则基本没有区分性。

【2】角点的定义:

2

【3】判断角点的方法:

3
这里有个细节:将计算的所有方向上的变化值平方和的最小值作为像素点的灰度变化特征值。为何是最小值呢?
分别对平均区域、边缘区域、角落区域进行计算,观察结果:
4
取最小值,这样边缘的特征值为0了,将边缘与角点区分开来。(边缘的特点是一个方向变化值不明显,与之垂直的方向变化值明显)
这种方法的缺点:
滑动窗口缺点:窗口滑动只有8个方向,当边缘角落的角度不在这8个方向上则检测不准。

【4】Harris角点检测法

Harris角点检测法使用特征值的方式,使得任何方向上的角点都可以被检测出来。
数学定义:
1
加权函数形式:高斯分布形式、均值函数形式
公式继续化简:
2
泰勒公式回顾:

1
由于图像是二元函数,这里只取,x和y方向上的一阶导数做近似。

3
海森矩阵:
1
矩阵
2
平原地区,四周望去皆是平坦,最陡峭和最不陡峭的地方陡峭程度差不多。
悬崖地区,水平方向上望去很平坦,从其垂直方向看去,十分陡峭。
站立山尖,四周皆是十分陡峭。
R称之为响应函数,k根据经验取0.02~0.04左右

示例

Opencv自带函数:cornerHarris()函数

void cornerHarris( InputArray src, OutputArray dst, int block Size,  int ksize, double k, int borderType = BORDER_DEFAULT)

1.InputArray类型的src,输入图像,即原图像,填Mat类型即可,且需要为单通道8位或者浮点型图像;
2.OutputArray类型的dst,函数调用后的运算结果存在这里,即这个参数用于存放Harris角点检测的输出结果,和原图片有一样的尺寸和类型;
3.int类型的blockSize,表示邻域的大小,更多详细信息在cornerEigenValsAndVecs()中讲到;
4.int类型的ksize,表示Sobel()算子的孔径的大小;
5.double类型的k,Harris参数;
6.int类型的borderType,图像像素的边界模式。注意它有默认值BORDER_DEFAULT;

示例程序1

int main()
{//改变控制台字体颜色system("color 02");//读取图像//Mat src_image = imread("D:\\opencv_picture_test\\霍夫变换\\霍夫变换.png", 0);Mat src_image = imread("D:\\opencv_picture_test\\角点检测\\五角星.jpg", 0);//出错判断if (!src_image.data){cout << "src image load failed!" << endl;return -1;}//进行角点检测,找出角点Mat cornerStrength;cornerHarris(src_image, cornerStrength,2,3,0.03);//对灰度图进行阈值操作,得到二值图并显示Mat harrisCorner;threshold(cornerStrength, harrisCorner,0.00001,255,THRESH_BINARY);//显示namedWindow("角点图", WINDOW_NORMAL);imshow("角点图", cornerStrength);namedWindow("二值图", WINDOW_NORMAL);imshow("二值图", harrisCorner);waitKey(0);return 0;
}

需要注意的是:角点计算后需要进行二值化才能较好地可视化角点。最好是归一化一下。
原图:
原图
cornerStrength角点图:
cornerStrength
harrisCorner二值化后的角点图:
harrisCorner

示例程序2

#include <opencv2/opencv.hpp>
#include <iostream>
#include "windows.h"
#include <stdio.h>
#include <time.h>
#include <math.h>  
//#include "My_ImageProssing_base.h"
#define WINDOW_NAME1 "【程序窗口1】"			
#define WINDOW_NAME2 "【程序窗口2】"	
using namespace cv;
using namespace std;
RNG g_rng(12345);//*--------------------------动态角点检测-------------------------------------*/Mat g_srcImage, g_srcImage1, g_grayImage;
int thresh = 20;
int max_thresh = 205;
void on_CornerHarris(int ,void*);
int main()
{//改变控制台字体颜色system("color 02");//读取图像//Mat src_image = imread("D:\\opencv_picture_test\\霍夫变换\\霍夫变换.png", 0);g_srcImage = imread("D:\\opencv_picture_test\\角点检测\\五角星.jpg", 1);//出错判断if (!g_srcImage.data){cout << "src image load failed!" << endl;return -1;}//namedWindow("原始图", WINDOW_NORMAL);//imshow("原始图", g_srcImage);g_srcImage1 = g_srcImage.clone();cvtColor(g_srcImage1, g_grayImage,COLOR_BGR2GRAY);//创建窗口和滑动条namedWindow(WINDOW_NAME1, WINDOW_NORMAL);createTrackbar("阈值",WINDOW_NAME1,&thresh,max_thresh, on_CornerHarris);//初始化回调函数on_CornerHarris(0,0);waitKey(0);return 0;
}
void on_CornerHarris(int, void*)
{//定义局部变量Mat dstImage;Mat normImage;	//归一化Mat scaleImage;	//线性变换后的八位无符号整型的图//初始化,清除上一次调用次函数时他们的值dstImage = Mat::zeros(g_srcImage.size(),CV_32FC1);g_srcImage1 = g_srcImage.clone();//进行角点检测,找出角点Mat cornerStrength;cornerHarris(g_grayImage, dstImage, 2, 3, 0.03);//归一化与转换normalize(dstImage, normImage,0,255,NORM_MINMAX,CV_32FC1,Mat());convertScaleAbs(normImage, scaleImage);	//将归一化后的图线性变换成8位无符号整数//进行绘制for (int j = 0;j < normImage.rows;j++){for (int i = 0;i < normImage.rows;i++){Scalar color = Scalar(g_rng.uniform(0, 255), g_rng.uniform(0, 255), g_rng.uniform(0, 255));//任意值if ((int)normImage.at<float>(j, i) > thresh+60){circle(g_srcImage1,Point(i,j),5, color,2,8,0);circle(scaleImage, Point(i, j), 5, color, 2, 8, 0);}}}imshow(WINDOW_NAME1, g_srcImage1);imshow(WINDOW_NAME2, scaleImage);
}

需要注意的是,当阈值较小的时候,可能会“检测”出若干个角点,绘制时会卡住,所以需要限制一下,这里我们去最低为60。
效果:
1
2


参考资料:

《Opencv3编程入门.毛星云版》
《数字图像处理PPT.李竹版》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/378587.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

02-图像的几何变换

一、图片缩放 imageInfo&#xff1a;图片宽、高、通道个数等 缩放&#xff1a; 等比例缩放&#xff1a;宽高比不变 任意比例缩放&#xff1a;图片拉伸、非拉伸 窗体大小 实现步骤&#xff1a; 1&#xff0c;完成图像的加载&#xff0c;拿到图像的数据信息 2&#xff0c;图片的宽…

c ++查找字符串_C ++数组| 查找输出程序| 套装5

c 查找字符串Program 1: 程序1&#xff1a; #include <iostream>using namespace std;int main(){char* STR[] { "HELLO", "HIII", "RAM", "SHYAM", "MOHAN" };cout << (*STR 2)[2];return 0;}Output: 输出&…

MSSQL 链接Oracle 表

在Oracle中&#xff0c;要访问远程的另外一台数据库的话&#xff0c;是建立DBlink的方式。 在MSSQL中&#xff0c;则是以建立“link server 链接服务器”来远程访问另外一台数据库。 现在从MSSQL 2005访问Oracle的scott.dept。 首先&#xff0c;安装Oracle的客户端PLSQL DEVELO…

SQL Server 2008 高可用性视频(四)-- 故障转移群集

做数据库的朋友都知道, 其实数据库的工作大致可以分为三类: 数据库设计与开发, 数据库管理, 数据库商业智能. 其中数据库管理的工作大部分是由DBA在做, DBA们除了要保证正常的数据库运行, 还要采取必要措施提升数据库的性能, 比如数据库的性能优化, 以及保证数据库系统的高可用…

php 虚拟空间,什么是php虚拟主机?

什么是php虚拟主机&#xff1f;什么是php虚拟主机Php虚拟主机简单来说就是支持php语言开发的虚拟主机&#xff0c;我们把它称为php虚拟主机。php虚拟主机的工作原理Php是一种html嵌入式的语言&#xff0c;是一种在服务器端执行的嵌入html文档的脚本语言&#xff0c;类似于c语言…

C++---肿瘤面积

【问题描述】 在一个正方形的灰度图片上&#xff0c;肿瘤是一块矩形的区域&#xff0c;肿瘤的边缘所在的像素点在图片 中用 0 表示。其它肿瘤内和肿瘤外的点都用 255 表示。现在要求你编写一个程序&#xff0c;计算肿瘤内部的像素点的个数&#xff08;不包括肿瘤边缘上的点&am…

微机原理——8086中断类型以及中断向量表、中断响应、中断返回

博主联系方式&#xff1a; QQ:1540984562 QQ交流群&#xff1a;892023501 群里会有往届的smarters和电赛选手&#xff0c;群里也会不时分享一些有用的资料&#xff0c;有问题可以在群里多问问。 目录先验知识回顾控制寄存器回顾1、8086中断类型1、外部可屏蔽中断2、外部不可屏蔽…

著名开源项目_著名开源项目案例研究

著名开源项目维基百科 (Wikipedia) Wikipedia is no less than an encyclopedia available free of cost to the public nowadays. If you want to write a passage, know about some famous person or thing you are just one click away from your desired article. 维基百科…

资料整理-工具篇

* 代码利器 Resharper 作为一个C#er&#xff0c;非常感谢有Resharper这样的代码利器。在VS系列的IDE中&#xff0c;使用Resharper后&#xff0c;你会发现&#xff0c;原来写代码也可以是一种享受&#xff01; 1. 首先&#xff0c;下载Resharper。下载地址&#xff1a;http://ww…

企业级php第三方支付平台,ThinkPHP新版企业级php第三方api第四方支付平台程序源码商业版 带接口文件等 某宝售价3000元...

本帖最后由 商业源码网 于 2017-12-21 11:23 编辑7 h$ . , C u0 R3 R y$ z! ] q( D D$ s( Y源码说明&#xff1a;) G: y; R# G0 0 g N. ; \0 w, A9 {5 # P今天黑锐给大家分享给好东西&#xff01;很不错的支付系统&#xff01;喜欢研究支付接口的朋友别错过&#xff01;ThinkP…

C++---两数之和

【问题描述】 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 【输入形…

C++语法:构造函数以及析构函数

目录定义主要特点C的构造函数定义格式示例1&#xff1a;不带参数的构造函数示例2&#xff1a;带参数的构造函数示例3&#xff1a;使用初始化列表来初始化字段类的析构函数定义 构造函数 &#xff0c;是一种特殊的方法。主要用来在创建对象时初始化对象&#xff0c; 即为对象成…

大学各系男生追MM的专业短信

环卫系 天气预报&#xff1a;今天凌晨到白天有时有想你&#xff0c;下午转大到暴想&#xff0c;预计心情将由此降低五度。受延长低气压带影响&#xff0c;预计此类天气将持续到见到你为止。 历史系 据说最早的爱情诗是这样写的&#xff1a;你来自云南元谋&#xff0c;我来自北京…

scala中命名参数函数_Scala中带有命名参数的函数

scala中命名参数函数具有命名参数的函数 (Functions with named arguments ) A function is Scala can take multiple arguments. These arguments are traditionally called in sequence while calling a function. But in Scala programming, the program is given the power…

【IT笔试面试题整理】 二叉树任意两个节点间最大距离

求一个二叉树中任意两个节点间的最大距离&#xff0c;两个节点的距离的定义是这两个节点间边的个数&#xff0c; 比如某个孩子节点和父节点间的距离是1&#xff0c;和相邻兄弟节点间的距离是2&#xff0c;优化时间空间复杂度。 一种是&#xff1a;经过根节点&#xff0c;此时只…

请问染色浴比对染色性能有影响吗?浴比对染色的哪些性能有影响?染色亲和力测定有哪些实际应用意义

2.6 染色热力学参数 染色热、染色熵测定方法 请问染色浴比对染色性能有影响吗&#xff1f;浴比对染色的哪些性能有影响&#xff1f;染色亲和力测定有哪些实际应用意义&#xff1f; 答&#xff1a;浴比&#xff0c;又称液比。指纺织品与染液等的重量比例&#xff0c;即被染物重…

php排序地区,怎么在php项目中实现一个地区分类排序算法

怎么在php项目中实现一个地区分类排序算法发布时间&#xff1a;2020-12-30 16:11:30来源&#xff1a;亿速云阅读&#xff1a;86作者&#xff1a;Leah怎么在php项目中实现一个地区分类排序算法&#xff1f;相信很多没有经验的人对此束手无策&#xff0c;为此本文总结了问题出现的…

OpenCV实战【2】HOG+SVM实现行人检测

目录HOG是什么&#xff1f;HOG vs SIFTHOG步骤HOG在检测行人中的方式Opencv实现HOGDescriptor的构造函数&#xff1a;行人检测HOGSVM步骤简化版的HOG计算HOG是什么&#xff1f; 方向梯度直方图( Histogram of Oriented Gradient, HOG )特征是一种在计算机视觉和图像处理中用来进…

wchar_t 和 char

#include <windows.h> #include <stdio.h> //function: charTowchar //purpose:char to WCHAR 、wchar_t、LPWSTR etc void charTowchar(const char *chr, wchar_t *wchar, int size) { MultiByteToWideChar( CP_ACP, 0, chr, strlen(chr)…

坐标转换 计算机图形学_计算机图形学的转换类型

坐标转换 计算机图形学什么是转型&#xff1f; (What is Transformation?) Transformation refers to the mathematical operations or rules that are applied on a graphical image consisting of the number of lines, circles, and ellipses to change its size, shape, o…