《Opencv3编程入门》学习笔记—第十章

news2024/11/20 18:43:43

《Opencv3编程入门》学习笔记

记录一下在学习《Opencv3编程入门》这本书时遇到的问题或重要的知识点。

第十章 角点检测

一、Harris角点检测

(一)兴趣点与角点

1、图像特征类型:

  • 边缘
  • 角点(感兴趣点)
  • 斑点(感兴趣区域)

2、角点定义:

  • 一阶导数(灰度的梯度)的局部最大所对应的像素点
  • 两条及两条以上边缘的交点
  • 图像中梯度值和梯度方向的变化速率都很高的点
  • 角点处的一阶导数最大,二阶导数为0,指示了物体边缘变化不连续的方向

(二)角点检测

3、角点检测算法:
(1)基于灰度图像的角点检测

  • 基于梯度
  • 基于模板
    考虑像素邻域点的灰度变化,将与邻域点亮度对比足够大的点定义为角点
    常见算法:Kitchen-Rosenfeld角点检测、Harris角点检测、KLT角点检测、SUSAN角点检测
  • 基于模板梯度组合

(2)基于二值图像的角点检测
(3)基于轮廓曲线的角点检测

(三)harris角点检测

harris角点检测是一种直接基于灰度图像的角点提取算法,稳定性高,尤其对L型角点检测精度高。但由于采用了高斯滤波,运算速度相对较慢,焦点信息有丢失和位置偏移的现象,而且角点提取有聚簇现象。

(四)实现Harris角点检测:cornerHarris()函数

1、作用:
  基于灰度图像的角点提取算法,运行Harris角点检测算子进行角点检测
2、原理:
  和cornerMinEigenVal()以及cornerEigenValsAndVecs()函数类似,cornerHarris函数对于每一个像素(x,y)在blockSize*blockSize邻域内,计算2 * 2梯度的协方差矩阵M(x,y),然后找出输出图中局部最大值,即找出角点:
   在这里插入图片描述            
3、函数原型:

void cornerHarris(InputArray src, OutputArray dst, int blockSize, int ksize, double k, intborderType=BORDER_DEFAULT)

4、参数说明:
(1)输入图像,单通道8位或浮点型图像
(2)存放Harris角点检测输出结果,与原图像一样尺寸和类型
(3)邻域大小
(4)Sobel()算子孔径大小
(5)Harris参数
(6)图像像素边界模式,默认BORDER_DEFAULT

示例代码

#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace cv;
int main()
{
	//载入灰度图像并显示
	Mat srcImage = imread("D://lili/Desktop/jpg/opencv/9.jpg", 0);
	imshow("【原始图】", srcImage);

	//进行Harris角点检测
	Mat cornerStrength;
	cornerHarris(srcImage, cornerStrength, 2, 3, 0.01);

	//对灰度图进行阈值操作,得到二值图并显示
	Mat harrisCorner;
	threshold(cornerStrength, harrisCorner, 0.00001, 255, THRESH_BINARY);
	imshow("【角点检测后的二值效果图】", harrisCorner);

	waitKey(0);
	return 0;
}

运行效果
在这里插入图片描述

(五)综合示例:harris角点检测与绘制

示例代码

/*
	程序说明:滑动条调节阈值,以控制harris检测角点数量
*/
#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<iostream>
using namespace cv;
using namespace std;
//定义辅助宏
#define WINDOW_NAME1 "【原始图窗口】"
#define WINDOW_NAME2 "【程序窗口1】"
#define WINDOW_NAME3 "【程序窗口2】"
//全局变量
Mat g_srcImage, g_srcImage1, g_grayImage;
int thresh = 30;
int max_thresh = 175;
//全局函数
void on_CornerHarris(int, void*);
int main()
{
	//载入原图
	g_srcImage = imread("D://lili/Desktop/jpg/opencv/6.jpg");
	if (!g_srcImage.data)
	{
		printf("载入原图失败\n");
		return false;
	}
	imshow(WINDOW_NAME1, g_srcImage);

	g_srcImage.copyTo(g_srcImage1);
	cvtColor(g_srcImage, g_grayImage, COLOR_RGB2GRAY);
	
	//创建滑动条并初始化
	namedWindow(WINDOW_NAME2, WINDOW_AUTOSIZE);
	createTrackbar("阈值:", WINDOW_NAME2, &thresh, max_thresh, on_CornerHarris);
	on_CornerHarris(0, 0);

	waitKey(0);
	return 0;
}
void on_CornerHarris(int, void*)
{
	//局部变量
	Mat dstImage;//目标图
	Mat normImage;//归一化图
	Mat scaledImage;//线性变换后的八位无符号整型图
	
	//初始化
	//置零当前需要显示的两幅图,即清除上一次调用此函数时的值
	dstImage = Mat::zeros(g_srcImage.size(), CV_32FC1);
	g_srcImage.copyTo(g_srcImage1);
	
	//角点检测
	cornerHarris(g_grayImage, dstImage, 2, 3, 0.04, BORDER_DEFAULT);
	//归一化与转换
	normalize(dstImage, normImage, 0, 255, NORM_MINMAX, CV_32FC1, Mat());
	convertScaleAbs(normImage, scaledImage);//将归一化后的图线性变换成8位无符号整型
	//将检测到的,符合阈值条件的角点绘制出来
	for (int i = 0; i < normImage.rows; i++)
	{
		for (int j = 0; j < normImage.cols; j++)
		{
			if ((int)normImage.at<float>(i, j) > thresh + 80)
			{
				circle(g_srcImage1, Point(j, i), 5, Scalar(10, 10, 255), 2, 8, 0);
				circle(scaledImage, Point(j, i), 5, Scalar(0, 10, 255), 2, 8, 0);
			}
		}
	}
	imshow(WINDOW_NAME2, g_srcImage1);
	imshow(WINDOW_NAME3, scaledImage);
}

运行效果
在这里插入图片描述

二、Shi-Tomasi角点检测

(一)Shi-Tomasi角点检测概述

Shi-Tomasi算法是Harris算法的改进

(二)确定图像强角点:goodFeaturesToTrack()函数

1、定义:
  Harris算法改进,若矩阵M行列式的值与M的迹中较小的一个大于最小阈值,则会得到强角点
2、作用:
  确定图像的强角点,可用来初始化一个基于点的对象跟踪操作
3、函数原型:

void goodFeaturesToTrack(InputArray image, OutputArray corners, int maxCorners, double qualityLevel, double minDistance, InputArray mask=noArray(), int blockSize=3, bool useHarrisDetector=false, double k=0.04)

4、参数说明:
(1)输入图像,8位或浮点型32位单通道图像
(2)检测到的角点输出向量
(3)角点最大数量
(4)角点检测可接受的最小特征值为qualityLevel与图像中最大特征值的乘积,qualityLevel通常取0.1或0.01
(5)角点之间的最小距离,返回的角点之间距离不小于minDistance个像素
(6)可选参数,表示感兴趣区域,默认noArray(),参数非空则指定角点检测区域
(7)计算导数自相关矩阵时指定的范围,默认3
(8)指示是否使用Harris角点检测,默认false
(9)用于设置Hessian自相关矩阵行列式的相对权重的权重系数,默认0.04

(三)综合示例:Shi-Tomasi角点检测

示例代码

#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<iostream>
using namespace cv;
using namespace std;
//定义辅助宏
#define WINDOW_NAME "【Shi-Tomasi角点检测】"
//全局变量
Mat g_srcImage, g_grayImage,g_dstImage;
int g_maxCornerNumber = 33;//角点检测最大数量
int g_maxTrackbarNumber = 500;
RNG g_rng(12345);
//全局函数
void on_GoodFeaturesToTrack(int, void*);

int main()
{
	cout << "\n\n\t欢迎来到【Shi-Tomasi角点检测】示例程序\n" << endl;
	//载入原图像
	g_srcImage = imread("D://lili/Desktop/jpg/opencv/6.jpg", 1);
	cvtColor(g_srcImage, g_grayImage, COLOR_RGB2GRAY);
	namedWindow(WINDOW_NAME, WINDOW_AUTOSIZE);
	imshow(WINDOW_NAME, g_srcImage);
	//创建滑动条,回调函数初始化
	createTrackbar("最大角点数", WINDOW_NAME, &g_maxCornerNumber, g_maxTrackbarNumber, on_GoodFeaturesToTrack);
	on_GoodFeaturesToTrack(0, 0);

	waitKey(0);
	return 0;
}
void on_GoodFeaturesToTrack(int, void*)
{
	//对变量小于等于1时的处理
	if (g_maxCornerNumber <= 1) { g_maxCornerNumber = 1; }
	//Shi-Tomasi算法的参数准备
	vector<Point2f>corners;
	double qualityLevel = 0.01;//角点检测可接受最小特征值
	double minDistance = 10;//角点之间最小距离
	int blockSize = 3;//计算导数自相关矩阵时指定的邻域范围
	double k = 0.04;//权重系数
	Mat g_dstImage = g_srcImage.clone();

	//进行Shi-Tomasi角点检测
	goodFeaturesToTrack(g_grayImage, corners, g_maxCornerNumber, qualityLevel, minDistance, Mat(), blockSize, false, k);
	//输出文字信息
	cout << "\t>此次检测到的角点数量为:" << corners.size() << endl;
	//绘制检测到的角点
	int r = 4;
	for (int i = 0; i < corners.size(); i++)
	{
		//以随机的颜色绘制出角点
		circle(g_dstImage, corners[i], r, Scalar(g_rng.uniform(0, 255), g_rng.uniform(0, 255), g_rng.uniform(0, 255)), -1, 8, 0);
	}
	//显示窗口
	imshow(WINDOW_NAME, g_dstImage);
}

运行效果
在这里插入图片描述

三、亚像素级角点检测

(一)背景概述

1、原理:
  假设起始角点在实际亚像素角点附近,检测所有q-p向量,下面两种情况点p梯度与q-p向量的点积均为0:(1)点p附近图像均匀,即点p处梯度为0(2)边缘的梯度与沿边缘方向的q-p向量正交(向量与其正交向量点积为0),如下图:
   在这里插入图片描述
       
  则可以在p点周围找到很多组梯度以及相关向量q-p,令其点积为0,求解方程组,解即为角点q的亚像素级精度位置。
2、作用:
  将角点位置精确到亚像素级精度(精确的浮点类型位置),可用于几何测量、摄像机标定、跟踪并重建摄像机的轨迹。

(二)寻找亚像素级角点:cornerSubPix()函数

寻找亚像素级角点

void cornerSubPix(InputArray image, InputOutputArray corners, Size winSize, Size zeroZone, TermCriteria criteria)

(1)输入图像
(2)输入角点的初始坐标和精确的输出坐标
(3)搜索窗口一半,若 winSize=Size(5,5),表示使用(52+1)(52+1)=1111大小窗口
(4)死区一半,死区为不对搜索区的中央位置做求和运算的区域,用来避免自相关矩阵出现的某些可能的奇异性,值(-1,-1)表示没有死区
(5)求角点的迭代过程的终止条件。即角点位置的确定,迭代数大于或精确达到某设定值,此参数为最大迭代数或精确度或它们的组合

(三)综合示例:亚像素级角点检测

示例代码

/*
  程序说明:在Shi-Tomasi角点检测示例程序基础上,在on_GoodFeaturesToTrack()回调函数中加上亚像素角点检测代码,完成亚像素级角点检测
*/
#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace cv;
using namespace std;
//定义辅助宏
#define WINDOW_NAME "【亚像素级角点检测】"
//全局变量
Mat g_srcImage, g_grayImage, g_dstImage;
int g_maxCornerNumber = 30;
int g_maxTrackbarNumber = 500;
RNG g_rng(12345);
//全局函数
void on_GoodFeaturesToTrack(int, void*);
void ShowHelpText();

int main()
{
	cout << "\n\n\t欢迎来到【亚像素角点检测】示例程序\n" << endl;
	//载入原图
	g_srcImage = imread("D://lili/Desktop/jpg/opencv/6.jpg",1);
	cvtColor(g_srcImage, g_grayImage, COLOR_RGB2GRAY);
	namedWindow(WINDOW_NAME, WINDOW_AUTOSIZE);
	imshow(WINDOW_NAME, g_srcImage);
	//创建滑动条,回调函数初始化
	createTrackbar("最大角点数", WINDOW_NAME, &g_maxCornerNumber, g_maxTrackbarNumber, on_GoodFeaturesToTrack);
	on_GoodFeaturesToTrack(0, 0);

	waitKey(0);
	return 0;
}
void on_GoodFeaturesToTrack(int, void*)
{
	//对变量小于1时的处理
	if (g_maxCornerNumber <= 1) { g_maxCornerNumber = 1; }
	
//【1】Shi-Tomasi算法参数设置
	vector<Point2f>corners;
	double qualityLevel = 0.01;
	double minDistance = 10;
	int blockSize = 3;
	double k = 0.04;
	g_dstImage = g_srcImage.clone();
	//进行Shi-Tomasi角点检测
	goodFeaturesToTrack(g_grayImage, corners, g_maxCornerNumber, qualityLevel, minDistance, Mat(), blockSize, false, k);
	//输出文字信息
	cout << "\t>此次检测到的角点数量为:" << corners.size() << endl;
	//绘制角点
	int r = 4;
	for (int i = 0; i < corners.size(); i++)
	{
		//以随机颜色绘制出角点
		circle(g_dstImage, corners[i], r, Scalar(g_rng.uniform(0, 255), g_rng.uniform(0, 255), g_rng.uniform(0, 255)), -1, 8, 0);
	}
	//显示更新窗口
	imshow(WINDOW_NAME, g_dstImage);
	
//【2】亚像素角点检测参数设置
	Size winSize = Size(5, 5);
	Size zeroZone = Size(-1, -1);
	TermCriteria criteria = TermCriteria(TermCriteria::EPS + TermCriteria::MAX_ITER, 40, 0.001);
	//计算出亚像素角点位置
	cornerSubPix(g_grayImage, corners, winSize, zeroZone, criteria);
	//输出角点信息
	for (int i = 0; i < corners.size(); i++)
	{
		cout << "\t>>精确角点坐标[" << i << "](" << corners[i].x << "," << corners[i].y << ")" << endl;
	}
}

运行效果
在这里插入图片描述

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

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

相关文章

在pycharm上导出Anaconda3的环境配置文件

目录 1.原理&#xff1a; ​2.亲身实践&#xff1a; 1.原理&#xff1a; 要在PyCharm中导出Anaconda3环境的配置文件&#xff0c;可以使用conda命令行工具来完成。请按照以下步骤进行操作&#xff1a; 打开PyCharm&#xff0c;并确保项目使用的是Anaconda3环境。 在PyCha…

【小程序】如何手动绘制分享用的图片

上一篇【小程序】如何实现滑动翻页中介绍了如何在小程序中实现上下滑动翻页的效果。 如果要给这个产品增加一个生成图片用于分享到朋友圈的功能&#xff0c;又该如何实现呢&#xff1f; 先来看一下最终的效果图&#xff1a; 首先&#xff0c;新建一个页面&#xff08;page&am…

vue+elementui实现英雄联盟道具城

目录 一、效果图 1.首页 2.商品列表、分类 二、实现重点讲解 1.首页轮播图 1.1技术实现&#xff1a; 1.2.鼠标聚焦切换图片事件 2.首页tab切换 3.商品列表实现 三、项目结构说明 四、总结 一、效果图 1.首页 项目与官方效果没有太大差异&#xff1a; 游戏导航&#xff1…

windows上VMware虚拟机彻底卸载详细教程

VMware虚拟机彻底卸载 一、彻底卸载过程1.1 停止VMware服务1.2 结束vmware任务1.3 开始卸载VMware1.4 删除注册表信息1.5 删除安装目录 二、vmware 安装教程三、vmware 使用教程 回到目录   回到末尾 一、彻底卸载过程 卸载之前&#xff0c;需要先关闭VMware相关的后台服务…

高速公路智慧稽核常用技术及发展方向浅析

交通运输部数据显示&#xff0c;截至2021年末&#xff0c;全国收费公路里程达18.76万公里&#xff0c;其中高速公路16.12万公里&#xff0c;占比高达85.9%&#xff0c;高速公路费用收缴的重要性尤为凸显。 收费系统作为高速公路的三大机电系统之一&#xff0c;在高速费用的收取…

【Java面试题】框架篇——Spring

文章目录 什么是Spring框架&#xff1f;Spring框架有哪些主要模块&#xff1f;Spring有几种配置方式&#xff1f;Spring框架中的单例Beans是线程安全的么&#xff1f;Spring 框架中都用到了哪些设计模式&#xff1f;★★★Spring AOP在实际项目中的应用★★★阐述一下Bean的生命…

使用 Transformers 为多语种语音识别任务微调 Whisper 模型

本文提供了一个使用 Hugging Face &#x1f917; Transformers 在任意多语种语音识别 (ASR) 数据集上微调 Whisper 的分步指南。同时&#xff0c;我们还深入解释了 Whisper 模型、Common Voice 数据集以及微调等理论知识&#xff0c;并提供了数据准备和微调的相关代码。如果你想…

django-vue-admin 运行记录

django-vue-admin 运行记录 1. 安装 ubuntu-20.04.6 桌面版 ubuntu-20.04.6-desktop-amd64.iso 桌面版本 桌面版的目的是 有浏览器可以看 django vue 的localhost网页。 用server版&#xff0c;需要用别的机器看&#xff0c;别的机器在权限上可能有问题。 sudo apt install …

ChatGLM2-6B-Int4本地部署

原文链接&#xff1a;http://wangguo.site/posts/9d8c1768.html ChatGLM2-6B 是开源中英双语对话模型 ChatGLM-6B 的第二代版本 GitHub地址&#xff1a;https://github.com/THUDM/ChatGLM2-6B 1、先看效果 2、本地部署 部署环境 wsl2-ubuntu22.04 LTS-----------------------…

计网简答题

答案不保证正确性&#xff0c;仅供参考。 1.有如图所示的以太网&#xff0c;每个交换机的名字及接口号、主机的名字及MAC地址都标明在图中。网络初启动时&#xff0c;两个交换机的转发表都为空&#xff0c;接着先后进行以下MAC帧传输&#xff1a;H1→H5&#xff0c;H3→H2&…

PG系列5:PG体系结构

文章目录 一. PG体系结构1.1 PG的体系结构概述1.2 PostgreSQL进程概述 二. PG内存结构三. PostgreSQL进程3.1 后台进程3.2 后端进程(backend)或服务器进程3.3 用户进程或客户端进程3.4 数据库服务器启动流程 四. PG逻辑结构4.1 PostgreSQL cluster4.2 database和cluster的关系4…

DevExpress WPF Scheduler组件,快速构建性能优异的调度管理器!(上)

无论您在WPF项目中是需要Outlook样式的调度程序&#xff0c;还是需要时间表或议程视图来向最终用户展示信息&#xff0c;DevExpress WPF Scheduler都提供了数十个选项&#xff0c;如集成的日程对话框等&#xff0c;因此用户可以快速构建下一个伟大的调度管理器。 DevExpress W…

抖音本地生活团购服务商

抖音本地生活团购服务商市场前景非常广阔。随着移动互联网的普及和人们对本地生活服务需求的增加&#xff0c;本地生活团购行业已成为一个快速增长的市场。而抖音平台拥有庞大的用户基础和强大的社交媒体传播力&#xff0c;为本地生活团购服务商提供了巨大的发展机遇。 抖音…

刷题日记《链表02》

题目描述 给定两个 非空链表 l1和 l2 来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。 可以假设除了数字 0 之外&#xff0c;这两个数字都不会以零开头。 解题思路 面对这种求和相加的题目&#xff0c;不知道…

windows 下安装 mysql-8.0.25 解压版

介绍 此文介绍 mysql-8.0.25-winx64 的 zip 解压版&#xff0c;在 windows 下的安装与配置过程。 官方下载 官网下载页&#xff1a; https://downloads.mysql.com/archives/community/ 进入官网&#xff0c;选择默认版本就行&#xff0c;不需要包含测试工具套件的版本 本地解…

C++ day40

1、思维导图 2、定义一个命名空间Myspace&#xff0c;包含以下函数&#xff1a;将一个字符串中的所有单词进行反转&#xff0c;并输出反转后的结果。例如&#xff0c;输入字符串为"Hello World"&#xff0c;输出结果为"olleH dlroW"&#xff0c;并在主函数…

0基础入门---第四章---误差反向传播法

&#x1f31e;欢迎来到深度学习的世界 &#x1f308;博客主页&#xff1a;卿云阁 &#x1f48c;欢迎关注&#x1f389;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f31f;本文由卿云阁原创&#xff01; &#x1f64f;作者水平很有限&#xff0c;如果发现错误&#xff…

Java性能权威指南-总结19

Java性能权威指南-总结19 Java EE性能调优JVM线程调优调节线程栈大小偏向锁自旋锁线程优先级 小结 Java EE性能调优Web容器的基本性能 Java EE性能调优 JVM线程调优 JVM的某些调优策略可以影响线程和同步的性能。 调节线程栈大小 当空间非常珍贵时&#xff0c;可以调节线程…

Day6——Web安全基础

网络安全学习笔记Day6 Web安全基础 一.Web简介什么是Web&#xff1f;什么是因特网&#xff1f;互联网&#xff0c;因特网&#xff0c;万维网的关系万维网构想的诞生http协议URL 二.Web发展史Web1.0Web2.01.0与2.0的区别Web1.0的安全漏洞Web2.0的安全漏洞 三.杂项门户网站静态页…

戴尔笔记本如何用U盘重装Win10系统?

戴尔笔记本如何用U盘重装Win10系统&#xff1f;很多使用戴尔笔记本的用户&#xff0c;都想知道如何用U盘来重装Win10系统&#xff0c;用户首先要确认自己的戴尔笔记本电脑能不能联网&#xff0c;然后再准备一个8G以上的U盘&#xff0c;最后根据小编分享的戴尔笔记本用U盘重装Wi…