32 OpenCV Harris角点检测

news2024/10/6 6:45:00

文章目录

  • cornerHarris 算子
  • 示例

角点检测

cornerHarris 算子

void cv::cornerHarris ( InputArray  src,OutputArray dst,int  blockSize,int ksize,double K,int borderType = BORDER_DEFAULT)
src:待检测Harris角点的输入图像,图像必须是CV 8U或者CV 32F的单通道灰度图像
dst: 存放Harris评价系数的R矩阵,数据类型为CV 32F的单通道图像,与输入图像具有相同的尺寸
blockSize:邻域大小
ksize: Sobel算子的半径,用于得到梯度信息   
k:计算Harris评价系数R的权重系数
borderType:像素外推算法标志

示例

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

// 声明全局变量,用于存储输入图像和处理后的图像,以及阈值和最大阈值计数。
Mat src, gray_src;
int thresh = 130;
int max_count = 255;

// 定义输出窗口的标题。
const char* output_title = "HarrisCornerDetection Result";

// 执行Harris角点检测并显示结果的函数。
void Harris_Demo(int, void*);

int main(int argc, char** argv) {
    // 加载输入图像。
	src = imread("D:/vcprojects/images/home.jpg");
	if (src.empty()) {
		printf("无法加载图像...\n");
		return -1;
	}

    // 在窗口中显示输入图像。
	namedWindow("输入图像", CV_WINDOW_AUTOSIZE);
	imshow("输入图像", src);

    // 创建窗口以显示Harris角点检测结果。
	namedWindow(output_title, CV_WINDOW_AUTOSIZE);

    // 将输入图像转换为灰度图像。
	cvtColor(src, gray_src, COLOR_BGR2GRAY);

    // 创建一个滑动条,用于交互式调整阈值值。
	createTrackbar("阈值:", output_title, &thresh, max_count, Harris_Demo);

    // 首先执行Harris角点检测。
	Harris_Demo(0, 0);

    // 无限等待按键。
	waitKey(0);
	return 0;
}

// 执行Harris角点检测的函数。
void Harris_Demo(int, void*) {
    // 初始化变量,用于存储Harris角点检测的输出。
	Mat dst, norm_dst, normScaleDst;

    // 初始化Harris角点检测算法的参数。
	int blockSize = 2;
	int ksize = 3;
	double k = 0.04;

    // 将Harris角点检测算法应用于灰度输入图像。
	cornerHarris(gray_src, dst, blockSize, ksize, k, BORDER_DEFAULT);

    // 将输出归一化到范围[0, 255]。
	normalize(dst, norm_dst, 0, 255, NORM_MINMAX, CV_32FC1, Mat());

    // 将归一化输出转换为8位无符号整数。
	convertScaleAbs(norm_dst, normScaleDst);

    // 创建输入图像的副本,在其上绘制检测到的角点。
	Mat resultImg = src.clone();

    // 遍历归一化输出中的每个像素。
	for (int row = 0; row < resultImg.rows; row++) {
		//获取 normScaleDst 图像的第 row 行的指针,这样就可以通过该指针访问该行的像素值
		uchar* currentRow = normScaleDst.ptr(row);
		for (int col = 0; col < resultImg.cols; col++) {
            // 获取当前像素的值。
			int value = (int)*currentRow;
            // 如果值超过阈值,则在相应位置绘制一个圆圈。
			if (value > thresh) {
				circle(resultImg, Point(col, row), 2, Scalar(0, 0, 255), 2, 8, 0);
			}
            // 移动到行中的下一个像素。
			currentRow++;
		}
	}

    // 显示带有检测到的角点的结果图像。
	imshow(output_title, resultImg);
}

在这里插入图片描述

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

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

相关文章

【计算机毕业设计】基于微信小程序高校寻物平台

随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了基于 微信小程序的高校寻物平台的开发全过程。通过分析基于微信小程序的高校寻物平台管理的不足&#xff0c;创建了一个计算机管理基于微信小程序的高校寻物平台的方案…

找不到d3dx9_42.dll无法继续执行代码的原因分析及解决方法

当您在使用电脑过程中遇到提示“缺少d3dx9_42.dll”时&#xff0c;这实际上是操作系统在运行某些应用程序或游戏时遇到的一个常见问题。D3DX9_42.dll是DirectX 9的一部分&#xff0c;DirectX是一组由微软开发的多媒体处理软件组件&#xff0c;广泛用于提升游戏与多媒体程序的性…

智慧公厕解决了什么问题?

在现代城市生活中&#xff0c;公厕是一个不可忽视的环节。然而&#xff0c;过去的公共厕所常常存在管理不力、环境脏乱差等问题&#xff0c;给人们的生活带来了许多不便和困扰。为了解决这些问题&#xff0c;智慧公厕应运而生&#xff0c;成为了公共厕所使用、运行、管理、养护…

每日两题 / 101. 对称二叉树 230. 二叉搜索树中第K小的元素(LeetCode热题100)

101. 对称二叉树 - 力扣&#xff08;LeetCode&#xff09; 用两个指针同时遍历树的左右子树即可 每次遍历时&#xff0c;一个指针向左&#xff0c;另一个就要向右。一个向右&#xff0c;另一个就要向左 /*** Definition for a binary tree node.* struct TreeNode {* in…

【Stylus详解与引入】

文章目录 Stylus详解与引入一、Stylus简介二、Stylus的特性1. 变量2. 嵌套规则3. 混合&#xff08;Mixins&#xff09;4. 函数5. 条件语句和循环 三、Stylus的引入与配置1. 安装Stylus和stylus-loader2. 配置Webpack3. 在Vue项目中使用Stylus4. 编译Stylus代码四、Stylus的性能…

第二步->手撕spring源码之bean操作

本步骤目标 本步骤继续完善 Spring Bean 容器框架的功能开发&#xff0c;在这个开发过程中会用到较多的接口、类、抽象类&#xff0c;它们之间会有类的实现、类的继承。 这一次我们把 Bean 的创建交给容器&#xff0c;而不是我们在调用时候传递一个实例化好的 Bean 对象&#x…

VMware配置Kali linux + 物理机连接Xshell

VMware 配置 kali linux 首先需要先安装VMware Workstation 我是在Windows 安装的 VMware Workstation Pro 17 虚拟化&#xff0c;产品密钥。。这里不做多说了 下载kali linux 这里我下载的是kali-linux-2024.1 Note&#xff1a;这里选Virtual Machines&#xff0c;建议不要…

数据分享—鄱阳湖矢量边界数据

鄱阳湖位于中国江西省北部&#xff0c;是中国最大的淡水湖泊之一&#xff0c;也是长江流域第一大湖。鄱阳湖水域广阔&#xff0c;湖区面积约为3600平方公里。鄱阳湖拥有丰富的水生生物资源&#xff0c;湖中有多种淡水鱼类和水生植物&#xff0c;是重要的渔业资源基地之一。湖泊…

RocketMQ(一)

作用 1. 限流削峰 2. 异步解耦 组成 Producer&#xff1a;消息的发送者&#xff0c;生产者&#xff1b;举例&#xff1a;发件人 Consumer&#xff1a;消息接收者&#xff0c;消费者&#xff1b;举例&#xff1a;收件人 Broker&#xff1a;暂存和传输消息的通道&#xff1…

简要介绍三大脚本语言 Shell、Python 和 Lua

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 脚本语言是一种用于自动化操作系统任务和应用程序功能的编程语言。它们通常用于编写小到中等规模的程序&#xff0c;以提高任务执行的速度和效率。在众多脚本语言中&#xff0c;Shell、Python 和 Lua 是…

一竞技LOL:中韩首场对决暴露TES大问题 BLG和T1的比赛成为焦点!

北京时间5月12日,昨天结束的MSI比赛中第二场比赛是本次MSI第一场中韩大战,由LCK赛区的一号种子GEN战队对阵LPL的二号种子TES战队。TES最终是2:3非常遗憾的输给了Gen,这也意味着TES将要去败者组,本场比赛也是暴露出了TES战队比较大的问题,中单的英雄池以及上单369的状态成为TES战…

【Java】:向上转型、向下转型和ClassCastException异常

目录 先用一个生动形象的例子来解释向上转型和向下转型 向上转型&#xff08;Upcasting&#xff09; 向下转型&#xff08;Downcasting&#xff09; 向上转型 概念 例子 发生向上转型的情况 1.子类对象赋值给父类引用 2.方法参数传递 3.返回值 向下转型 概念 注意…

【数字IC设计】芯片设计中的RDC

RDC问题定义 在芯片设计中,RDC是reset domain crossing 的缩写,类似于CDC(clock domain crossing),由于现在SOC芯片是有很多ECUs组成,为了使整个系统能够快速从复位中恢复, 用户希望SOC里面每个ECU模块都可以有自己独立的异步复位信号,这样可以在出问题的时候只复位有错…

Java | Spring框架 | AOP代理机制

大家好&#xff0c;我是程序员影子&#xff0c;一名AI编程深耕者&#xff0c;点击左上角头像了解我的详细信息。 今天来聊一聊关于Java中的Spring AOP代理机制中的JDK动态代理与CGLIB。 一、JDK动态代理 JDK动态代理是Spring AOP默认使用的代理机制。它基于Java反射机制&…

IO:线程的同步互斥

一、引入 例&#xff1a; 要求定义一个全局变量 char buf[] "1234567"&#xff0c;创建两个线程&#xff0c;不考虑退出条件。 A线程循环打印buf字符串&#xff0c; B线程循环倒置buf字符串&#xff0c;即buf中本来存储1234567&#xff0c;倒置后buf中存储7654321.…

【计算机毕业设计】基于微信小程序校友会系统的实现

由于APP软件在开发以及运营上面所需成本较高&#xff0c;而用户手机需要安装各种APP软件&#xff0c;因此占用用户过多的手机存储空间&#xff0c;导致用户手机运行缓慢&#xff0c;体验度比较差&#xff0c;进而导致用户会卸载非必要的APP&#xff0c;倒逼 管理者必须改变运营…

2024.5.9 关于 SpringCloud —— Nacos 的安装与配置

目录 Windos 安装步骤 docker 启动 nacos Windos 安装步骤 1&#xff09;点击下方链接&#xff0c;进入并访问 nacos 官网 Nacos官网 | Nacos 官方社区 | Nacos 下载 | Nacos 2&#xff09;按照下图箭头指示下载对应版本的压缩包 3&#xff09;此时我们将得到一个压缩包&…

GDPU JavaWeb 过滤器

再纯净的白开水也过滤不了渣茶。 Servlet登陆页面 引入数据库&#xff0c;创建用户表&#xff0c;包括用户名和密码&#xff1a;客户端通过login.jsp发出登录请求&#xff0c;请求提交到loginServlet处理。如果用户名和密码跟用户表匹配则视为登录成功&#xff0c;跳转到loginS…

【iOS】RunLoop详解(二)

RunLoop详解&#xff08;二&#xff09; RunLoop 的概念RunLoop 与线程的关系RunloopRunloop与线程的关系RunLoop对外的接口Runloop的Mode举例说明小结 RunLoop 的内部逻辑RunLoop的底层实现苹果用RunLoop实现的功能AutoreleasePool事件响应手势识别界面更新定时器PerformSelec…

制作绿色便携式Chrome浏览器

准备环境 chrome离线解压包7zip解压缩软件Chrome Portable便携版启动程序 一、获取Chrome离线解压包 获取官方的离线下载包&#xff0c;使用7zip软件打开压缩包。如果里面看到的事102~表示是离线安装包&#xff0c;如果是chrome.7z表示是离线解压包。 如果是解压包的话&…