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

article/2025/10/8 4:32:25

博主联系方式:
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://chatgpt.dhexx.cn/article/LFTkG6KY.shtml

相关文章

Harris角点检测原理详解

关于角点的应用在图像处理上比较广泛&#xff0c;如图像匹配(FPM特征点匹配)、相机标定等。网上也有很多博客对Harris角点检测原理进行描述&#xff0c;但基本上只是描述了算法流程&#xff0c;而其中相关细节并未作出解释&#xff0c;这里我想对有些地方做出补充说明&#xff…

OpenCV——Harris角点检测

目录 一、Harris角点检测二、C代码三、python代码四、结果展示1、原始图像2、Harris角点 一、Harris角点检测 角点原理来源于人对角点的感性判断&#xff0c;即图像在各个方向灰度有明显变化。算法的核心是利用局部窗口在图像上进行移动判断灰度发生较大的变化&#xff0c;所以…

Harris角点检测

目录 一.基本原理 1.基本思想 2.数学模型 二.实现代码 三.实验结果与分析 1.场景一&#xff1a;纹理平坦场景 2.场景二&#xff1a;多水平边缘场景 3.场景三&#xff1a;角点丰富场景 四.实验总结 一.基本原理 1.基本思想 判断图像的角点&#xff0c;可以利用卷积窗…

harris角点检测原理

目录 1、角点概述 2、数学知识 3、Harris角点检测基本原理 4、优化改进 1、角点概述 如果一个点在任意方向的一个微小变动都会引起灰度很大的变化&#xff0c;那么我们就把它称之为角点&#xff0c;也就是一阶导数(即灰度图的梯度)中的局部最大所对应的像素点就是角点。在现…

计算机视觉(角点检测)- 1 - Harris角点检测

计算机视觉&#xff08;角点检测&#xff09;- 1 - Harris角点检测 学习前言一、Harris角点检测  1、什么是角点&#xff1f;  2、Harris角点检测的基本原理&基本思想  3、Harris角点检测的数学表达  4、获取点数据后&#xff0c;计算 I x &#xff0c; I y I_x&#x…

Visual Studio的sln工程设置VTK、ITK项目

Visual Studio的sln工程设置VTK、ITK项目 最近在学习使用VTK和ITK&#xff0c;使用Visual Studio新建Qt项目时发现项目不是使用过去使用的CMake组织&#xff0c;而是使用的Visual Studio默认的.sln文件&#xff0c;便学习了一下使用Visual Studio的sln工程设置VTK、ITK项目&am…

windows sln的qt 工程

看起来应该vs开发 qt项目不需要qtcreator? 画界面应该还是需要的。装一个vs的插件 2019的如果打开的工程跟你本地的qt不一致 在工程名字上右键change qt version弹出一个框框,里面有俩这里应该选第一个,这个是我本地安装的,vs2015 x86 版本windows sln 工程【这个新建一个q…

Visual studio 2015修改项目文件名及.sln文件名

Visual studio 2015修改项目文件名及.sln文件名&#xff1a; 问题描述 提示&#xff1a;在使用原有的项目代建一个新项目时&#xff0c;为了方便区分与原项目&#xff0c;故要修改该项目的项目名。 如图&#xff1a; 需要将QtGuiApplication1.vcxproj修改成CARFILM.vcxproj&…

C# 解析 sln 文件

我的项目&#xff0c;编码工具 需要检测打开一个工程&#xff0c;获取所有项目。 但是发现原来的方法&#xff0c;如果存在文件夹&#xff0c;把项目放在文件夹中&#xff0c;那么是无法获得项目&#xff0c;于是我就找了一个方法去获得sln文件的所有项目。 原先使用的方法dte…

Visual studio无法打开C#\.sln文件,不兼容

23/7/19文章更新&#xff1a;后来我总结了我这个问题出现的原因&#xff0c;是因为我的VS是2015版本&#xff0c;本来安装在笔记本电脑上&#xff0c;为了转到台式机&#xff0c;直接U盘复制过来的&#xff0c;然后复制过来安装的时候提示某个东西安装失败&#xff0c;我就点击…

.sln图标异常修复

.sln图标显示异常 本人就喜欢新版本的东西&#xff0c;电脑上安装过vs2017,vs2019&#xff0c;想体验最新的vs2022是什么感觉&#xff0c;之后sln图标显示异常&#xff0c;不太顺眼 这是由于该文件VSFileHandler_64.dll异常带来的问题&#xff0c;下载我提供的文件&#xff0c…

Visual Studio打开无sln项目,修复无效sln文件

Visual Studio打开无sln项目&#xff0c;修复无效sln文件 打开项目文件地址&#xff08;可在项目名右键-在文件资源管理器中打开文件夹&#xff09; 打开-项目名.vcxproj文件 VC左上角点击全部保存&#xff0c;选择保存位置储存新的sln头文件 4.sln文件修复完成

VS2019 使用命令行编译工程sln

需要使用 devenv.com这个工具 具体的执行如下&#xff1a; test>"C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\Common7\IDE\devenv.com" build\1.sln /Build执行结果如下&#xff1a; 在对应的路径下找到可执行文件运行

Visual studio 2019 创建.sln项目

文章目录 创建.sln项目在当前解决方案下&#xff0c;添加项目如何切换启动项目如何打开 .sln的解决方案的项目 创建.sln项目 文件–>新建 不要勾选最后一项。 点击 上面界面的右下角的 创建 &#xff0c;进入下面的界面 解决方案和项目在电脑目录及在IDE上的展示 在当…

Unity sln 和 csproj 基础

根目录下 sln 和 csproj 区别 sln&#xff1a; solusion 简写&#xff0c;即解决方案 csproj&#xff1a;c sharp project 简写&#xff0c;即 C# 项目 解决方案sln是项目csproj的集合&#xff0c;项目是文件的集合。 一个 sln 中可以包含多个 csproj。 一个 csproj 可以包含多…

c语言编程题没有sln,使用CMake生成sln项目和VS工程遇到的问题

用vs运行cmake后的工程 1、单个文件示例: 1) 首先建立文件夹CMakeTest/Src 2) 在文件夹Src中建立两个文件main.c和CMakeLists.txt 3) main.c: #include int main() {printf("hello world."); getchar(); return 0; } 4) CMakeLists.txt PROJECT (HELLO) SET (SRC_L…

理解 Visual Studio 解决方案文件格式(.sln)

一般情况下我们并不需要关心 Visual Studio 解决方案文件格式&#xff08;.sln&#xff09;&#xff0c;因为 Visual Studio 对解决方案文件的自动修复能力是非常强的。但是如果遇到自动解冲突错误或者编译不通过了&#xff0c;那么此文件还是需要手工修改的。 基本概念 Visua…

Win平台使用cmake工具生成sln工程示例

先安装一个版本的cmake&#xff0c;3.17.2; 这应该是比较新的版本&#xff1b;我看到有的示例是3.7以下版本&#xff1b; cmake加到系统path变量&#xff1b; 安装完成&#xff1b; 新建一个C#prj目录&#xff0c;下面放一个cs文件&#xff0c;新建一个myprj1目录&#xff1b; …

linux系统sln命令,dotnet sln

dotnet slndotnet sln 12/07/2020 本文内容 本文适用于&#xff1a; ✔️ .NET Core 2.x SDK 及更高版本This article applies to: ✔️ .NET Core 2.x SDK and later versions “属性”Name dotnet sln - 在 .NET 解决方案文件中列出或修改项目。dotnet sln - Lists or modifi…

【通用】vs2019项目sln、suo、vcxproj、vcxproj.filters、vcxproj.user文件名解析及相关节点属性解析

1.sln 文件 (Solution 文件) 解决方案是在 Visual Studio 中组织项目的结构。 该解决方案将项目的状态信息保留在两个文件中&#xff1a; .sln 文件 (基于文本的共享) .suo 文件 (用户特定的二进制解决方案选项) 这里先讲.sln 文件&#xff0c;.sln 文件包含环境用于查找和加载…