当前位置: 首页 > news >正文

《OpenCV 计算机视觉》—— Harris角点检测、SIFT特征检测

文章目录

  • 一、Harris 角点检测
    • 1.基本思想
    • 2.检测步骤
    • 3.OpenCV实现
  • 二、SIFT特征检测
    • 1. SIFT特征检测的基本原理
    • 2. SIFT特征检测的特点
    • 3. OpenCV 实现

一、Harris 角点检测

OpenCV中的Harris角点检测是一种基于图像灰度值变化的角点提取算法,它通过计算每个像素点的响应函数来确定是否为角点。Harris角点检测算法的基本思想和步骤如下:

1.基本思想

Harris角点检测算法基于图像中角点的局部特征,角点处图像灰度变化明显,且向任何方向移动变化都很大。通过计算每个像素点的响应函数,并设置阈值来确定角点。

2.检测步骤

  1. 灰度化:将彩色图像转换为灰度图像,以便进行后续处理。

  2. 计算图像梯度:使用Sobel等算子计算图像在x和y方向上的梯度。这些梯度反映了图像在水平和垂直方向上的亮度变化。

  3. 计算梯度积方向矩阵(自相关矩阵):对于每个像素点,根据其周围的梯度值计算自相关矩阵。这个矩阵包含了该点x方向梯度的平方和、y方向梯度的平方和以及x方向梯度与y方向梯度的乘积。

  4. 计算角点响应函数:根据自相关矩阵计算Harris响应函数,其定义为 R = det ( M ) − k ⋅ trace ( M ) 2 R = \text{det}(M) - k \cdot \text{trace}(M)^2 R=det(M)ktrace(M)2,其中 M M M为自相关矩阵, det ( M ) \text{det}(M) det(M)为其行列式, trace ( M ) \text{trace}(M) trace(M)为其迹, k k k为一个经验参数,通常在0.04到0.06之间。

  5. 非极大值抑制:对于计算得到的响应函数图像,进行非极大值抑制,即保留局部最大值点,将其余点设为0,以消除重复检测的角点。

  6. 阈值化:根据设定的阈值,将响应函数图像中低于阈值的点排除,以得到最终的角点位置。

3.OpenCV实现

在OpenCV中,可以使用cv2.cornerHarris()函数来实现Harris角点检测。该函数的基本语法如下:

dst = cv2.cornerHarris(src, blockSize, ksize, k[, dst[, borderType]])
  • src:输入图像,应为单通道灰度图像,数据类型为float32。

  • blockSize:角点检测中使用的邻域大小,一般为2、3、4等奇数。

  • ksize:Sobel算子的大小,用于计算x和y方向的梯度,一般为3。

  • k:Harris角点检测方程中的自由参数,一般取值为0.04到0.06。

  • dst:输出图像,与输入图像大小相同,数据类型为float32,其中每个像素点的值表示该点的Harris响应函数值。

  • borderType:像素的边界模式,默认值为cv2.BORDER_DEFAULT

  • 下图为示例图片
    在这里插入图片描述

  • Harris角点检测代码实现

    import cv2# 读取图像并转换为灰度图像
    image = cv2.imread('Ta.png')
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 计算Harris角点响应图像
    dst = cv2.cornerHarris(gray, blockSize=4, ksize=3, k=0.04)# 标记检测到的角点
    image[dst > 0.05 * dst.max()] = [0, 255, 0]
    # 这里通过对角点响应进行阈值处理,标记出检测到的角点
    # 0.05 * dst.max()是一个值,大于这个值的像素点会被标记为绿色。# 显示结果图像
    cv2.imshow('Harris Corners', image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
  • 结果如下:
    在这里插入图片描述

二、SIFT特征检测

**SIFT(Scale-Invariant Feature Transform,尺度不变特征变换)**是一种在图像处理和计算机视觉领域广泛使用的特征检测算法。它主要用于检测图像中的局部特征点,并生成对应的描述符,这些特征点对图像的旋转、尺度缩放和亮度变化具有一定的不变性,同时对视角变化、仿射变换和噪声也保持一定程度的稳定性。以下是SIFT特征检测的详细介绍:

1. SIFT特征检测的基本原理

SIFT算法通过以下几个步骤来实现特征点的检测和描述:

  1. 尺度空间极值检测

    • 搜索所有尺度上的图像位置,通过高斯微分函数来识别潜在的对于尺度和旋转不变的兴趣点。
    • 构建高斯金字塔DoG(Difference of Gaussian)金字塔,通过比较相邻尺度图像的差分来检测极值点
  2. 关键点定位

    • 在每个候选的位置上,通过拟合精细的模型(如泰勒展开)来确定关键点的精确位置和尺度。
    • 关键点的选择依据于它们的稳定程度,通常选择局部极值点作为关键点。
  3. 方向确定

    • 基于图像局部的梯度方向,为每个关键点分配一个或多个主方向。
    • 通过计算关键点周围区域的梯度幅值和方向来确定主方向,以实现旋转不变性。
  4. 关键点描述

    • 在每个关键点周围的邻域内,在选定的尺度上测量图像局部的梯度。
    • 将这些梯度变换成一种表示,形成关键点的描述符。描述符由关键点周围的梯度方向直方图组成,通过拼接子区域的直方图来形成最终的描述符。
    • 对描述符进行归一化处理,以增强其鲁棒性。
  • 可结合以下图片理解
    在这里插入图片描述

2. SIFT特征检测的特点

  1. 独特性:SIFT特征具有很好的独特性,即使在复杂的场景中也能有效地区分不同的特征点。
  2. 多量性:即使图像中只包含少数几个物体,也能产生大量的SIFT特征向量,为匹配提供更多的可能性。
  3. 高速性:经过优化的SIFT匹配算法可以达到实时的要求,适用于需要快速处理的应用场景。
  4. 可扩展性:SIFT特征可以很方便地与其他形式的特征向量进行联合,提高匹配的准确性和鲁棒性。

3. OpenCV 实现

  • 步骤:
    • 1.加载图像
    • 2.创建SIFT对象
    • 3.检测关键点和计算描述符
    • 4.绘制关键点
    • 5.显示图像
  • 下图为特征检测的图片
    在这里插入图片描述
  • SIFT特征检测代码实现
    import cv2# 加载图像并转换为灰度图
    image = cv2.imread('sea.jpg')
    image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)# 在OpenCV中,使用cv2.SIFT_create()或cv2.xfeatures2d.SIFT_create()函数(取决于OpenCV的版本和配置)来创建一个SIFT对象。
    # 这个对象将用于后续的关键点检测和描述符生成。
    sift = cv2.SIFT_create()
    # 或者在某些OpenCV版本中可能需要
    # sift = cv2.xfeatures2d.SIFT_create()# 使用SIFT对象的detectAndCompute()方法来检测图像中的关键点并计算它们的描述符
    keypoints, descriptors = sift.detectAndCompute(image_gray, None)# 使用cv2.drawKeypoints()函数将检测到的关键点绘制到图像上
    image_with_keypoints = cv2.drawKeypoints(image, keypoints, None, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)# 显示图像
    cv2.imshow('Image with Keypoints', image_with_keypoints)
    cv2.waitKey(0)  # 等待任意键盘按键
    cv2.destroyAllWindows()  # 关闭所有OpenCV窗口
    
  • 结果如下:
    在这里插入图片描述

相关文章:

《OpenCV 计算机视觉》—— Harris角点检测、SIFT特征检测

文章目录 一、Harris 角点检测1.基本思想2.检测步骤3.OpenCV实现 二、SIFT特征检测1. SIFT特征检测的基本原理2. SIFT特征检测的特点3. OpenCV 实现 一、Harris 角点检测 OpenCV中的Harris角点检测是一种基于图像灰度值变化的角点提取算法,它通过计算每个像素点的响…...

rtmp协议转websocketflv的去队列积压

websocket server的优点 websocket server的好处:WebSocket 服务器能够实现实时的数据推送,服务器可以主动向客户端发送数据 1 不需要客户端不断轮询。 2 不需要实现httpserver跨域。 在需要修改协议的时候比较灵活,我们发送数据的时候比较…...

Elasticsearch实战应用:构建高效搜索引擎

在大数据时代,如何高效存储和检索海量信息成为了一个重要课题。Elasticsearch作为一个开源的分布式搜索引擎,以其强大的搜索能力和灵活的扩展性,成为了许多企业和开发者的首选。本文将深入探讨Elasticsearch的实战应用,包括基本概…...

Hive数仓操作(四)

一、Hive 创建表案例一(ARRAY数组类型) 1. 准备数据文件 首先,准备一个名为 stu2.txt 的文件,文件内容示例如下: 1001 Alice fish,cat 1002 Bob dog,rabbit 1003 Charlie bird注意: …...

《C++跨平台开发:突破界限,释放无限可能》

在当今的软件开发领域,跨平台开发已成为一种重要趋势。它允许开发者编写一次代码,然后在多个不同的操作系统和硬件平台上运行,极大地提高了开发效率和软件的可扩展性。而 C作为一种强大的编程语言,也具备实现跨平台开发的能力。本…...

速盾:免备案服务器?

速盾是一家提供网络安全服务的公司,其主要产品包括CDN加速、WEB防护、WAF、DDoS防护等。在网站建设过程中,选择一个合适的服务器是非常重要的一步。传统的服务器需要备案,涉及到较多的流程和审批时间,给网站运营带来了一定的麻烦。…...

Electron获取nodejs和chrome版本信息

Electron获取nodejs和chrome版本信息 环境&#xff1a; electron: 30.1.1 nodejs: 20.14.0代码 $ tree . --- index.html --- index.js --- package.jsonindex.html <!DOCTYPE html> <html><head><meta charset"UTF-8" /><title>H…...

【React】setState 批量更新

setState 批量更新的过程 React 的 setState 调用是异步的。为了性能原因&#xff0c;React 会将多个 setState 调用合并成一次批量更新。具体过程如下&#xff1a; 1&#xff09;React 先将调用的每个 setState 所产生的更新对象存储在一个队列中。 2&#xff09;在所有的同步…...

微信小程序开发日记第二天

坚持在各个平台更新自己写小程序的心得体会&#xff0c;在百度贴吧和csdn更新自己的小程序日记&#xff0c;同时也是个体不断地对于云技术的开发和成长&#xff0c;进行提升&#xff01;不断地将开源开放创新思维运用到自己的小程序当中&#xff0c;小程序制作的关键就是&#…...

如果您忘记了 Apple ID 和密码,按照指南可重新进入您的设备

即使您的 iPhone 或 iPad 由于各种原因被锁定或禁用&#xff0c;也可以使用 iTunes、“查找我的”、Apple 支持和 iCloud 解锁您的设备。但是&#xff0c;此过程需要您的 Apple ID 和密码来验证所有权并移除激活锁。如果您忘记了 Apple ID 和密码&#xff0c;请按照我们的指南重…...

Top4免费音频剪辑软件大比拼,2024年你选哪一款?

现在我们生活在一个数字化的时代&#xff0c;音频内容对我们来说很重要。不管是给自己拍的视频配背景音乐、整理开会时的录音&#xff0c;还是自己写歌&#xff0c;有个好用的音频剪辑软件都特别重要。今天&#xff0c;我要给大家介绍几款特别好用的音频剪辑软件免费的&#xf…...

基于SSM的电影院售票系统设计与实现

文未可获取一份本项目的java源码和数据库参考。 前言 近些年的电影在人们文娱活动中占据重要地位&#xff0c;另外&#xff0c;由于人们的生活越来越富有&#xff0c;越来越多的人们不再选择在家里看电影&#xff0c;而是选择去电影院看电影。但是&#xff0c;以往的售票方式是…...

uniapp 必须掌握的细节

1.使用watch实现实时监控的效果 例如&#xff1a;实时监测手机号码的示例 // 实时监测手机号码 watch(() > UserRegisterForm.value.phone, (newPhone) > {// 简单的手机号码正则表达式验证const phoneRegex /^1[3-9]\d{9}$/;tips.value.tipPhone !phoneRegex.test(n…...

JavaWeb——Vue组件库Element(3/6):常见组件:Dialog对话框、Form表单(介绍、使用、实际效果)

目录 Dialog对话框 介绍 使用 实际效果 Form表单 介绍 使用 实际效果 Dialog对话框 介绍 Dialog对话框&#xff1a;在保留当前页面状态的情况下&#xff0c;告知用户并承载相关操作。 Dialog 对话框组件可以在保留当前页面信息的状态下弹出一个对话框&#xff0c;并…...

一个月学会Java 第2天 认识类与对象

Day2 认识类与对象 第一章 初识类 经过一个程序的编写&#xff0c;应该对程序的结构有点好奇了吧&#xff0c;如果你有基础&#xff0c;接下来的肯定非常的易懂&#xff0c;如果你没有基础也没有关系&#xff0c;反复琢磨一下也就懂了&#x1f606; 我们来重复一下第一个程序 …...

【WRF数据准备】MODIS静态地理数据下载及制备

【WRF数据准备】MODIS静态地理数据下载及制备 MODIS数据介绍数据下载数据拼接MRT工具介绍基于MRT软件完成数据拼接 格式转换&#xff1a;tif文件转二进制格式编写INDEX修改GEOGRID.TBL以及namelist.wps修改GEOGRID.TBL修改namelist.wps 参考 MODIS数据介绍 MODIS-MCD12Q1 v061…...

MySQL数据库——索引

目录 什么是索引&#xff08;Index&#xff09;&#xff1f; 怎样加索引&#xff1f; 索引的特点 索引类型 主键索引(Primary Key) 辅助索引&#xff08;二级索引&#xff09; 聚集索引和非聚集索引 聚集索引 非聚集索引 单列索引和联合索引 单列索引 联合索引 创…...

【SpringCloud】服务注册/服务发现-Eureka

服务注册/服务发现-Eureka 1. 背景1.1 问题描述1.2 解决思路1.3 什么是注册中⼼1.4 CAP理论1.5 常⻅的注册中⼼ 2. Eureka 介绍3. 搭建Eureka Server 1. 背景 1.1 问题描述 上个章节的例⼦中可以看到, 远程调⽤时, 我们的URL是写死的 String url "http://127.0.0.1:90…...

让你的Github Profile高大时尚!

目录 前言 正文 GitHub Profile 特点&#xff1a; GitHub Actions 核心概念&#xff1a; 应用场景&#xff1a; RSS RSS的主要特点&#xff1a; 使用场景&#xff1a; RSS的工作原理&#xff1a; 关于Github Readme Card 关于Github贡献的3D图 关于个人最新博文的获取 关于代码…...

ElasticSearch备考 -- Multi match

一、题目 索引task有3个字段a、b、c&#xff0c;写一个查询去匹配这三个字段为mom&#xff0c;其中b的字段评分比a、c字段大一倍&#xff0c;将他们的分数相加作为最后的总分数 二、思考 通过题目要求对多个字段进行匹配查询&#xff0c;可以考虑multi match、bool query操作。…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

python爬虫——气象数据爬取

一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用&#xff1a; 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests&#xff1a;发送 …...

华为OD机试-最短木板长度-二分法(A卷,100分)

此题是一个最大化最小值的典型例题&#xff0c; 因为搜索范围是有界的&#xff0c;上界最大木板长度补充的全部木料长度&#xff0c;下界最小木板长度&#xff1b; 即left0,right10^6; 我们可以设置一个候选值x(mid)&#xff0c;将木板的长度全部都补充到x&#xff0c;如果成功…...

spring Security对RBAC及其ABAC的支持使用

RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型&#xff0c;它将权限分配给角色&#xff0c;再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...