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

OpenCV:特征检测总结

目录

一、什么是特征检测?

二、OpenCV 中的常见特征检测方法

1. Harris 角点检测

2. Shi-Tomasi 角点检测

3. Canny 边缘检测

4. SIFT(尺度不变特征变换)

5. ORB

三、特征检测的应用场景

1. 图像匹配

2. 运动检测

3. 自动驾驶

4. 生物特征识别

四、总结


一、什么是特征检测?

特征检测是计算机视觉中的重要技术,用于识别图像中的关键点(如角点、边缘、纹理等),帮助计算机理解和分析图像内容。特征检测的核心目标是找到能够 稳定、独特、可区分 的图像区域,以便在后续的目标识别、图像匹配、运动估计等任务中使用。

特征检测的基本类型:

  1. 角点检测:检测图像中的拐角点,例如 Harris 角点、Shi-Tomasi 角点。
  2. 边缘检测:检测图像中强度变化明显的边界,例如 Canny 边缘检测。
  3. 局部特征点检测:提取关键点及其描述符,例如 SIFT、SURF、ORB、FAST。

二、OpenCV 中的常见特征检测方法

OpenCV 提供了多种特征检测算法,可以根据应用场景选择适合的方法。

1. Harris 角点检测

Harris 角点检测是一种用于检测角点的方法。角点是指图像中灰度变化较大的点,它们通常对应于结构的交点,如建筑物的拐角。

核心思想:

  • 计算图像窗口在不同方向上的灰度变化。
  • 若在所有方向上灰度变化较大,则认为该点是角点。

示例代码:

import cv2
import numpy as np# 读取图像并转换为灰度图
image = cv2.imread('D:\\resource\\filter\\shudu.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 计算 Harris 角点
harris_corners = cv2.cornerHarris(gray, blockSize=2, ksize=3, k=0.04)# 角点增强
image[harris_corners > 0.01 * harris_corners.max()] = [0, 0, 255]# 显示结果
cv2.imshow('Harris Corners', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

▶️运行结果:

 

应用场景:

  • 目标跟踪
  • 运动检测
  • 物体识别

2. Shi-Tomasi 角点检测

Shi-Tomasi 角点检测是 Harris 角点的改进版本,能够更好地选择稳定的角点。

import cv2
import numpy as np# 读取图像并转换为灰度图
image = cv2.imread('D:\\resource\\filter\\shudu.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 计算 Harris 角点
#harris_corners = cv2.cornerHarris(gray, blockSize=2, ksize=3, k=0.04)# 角点增强
#image[harris_corners > 0.01 * harris_corners.max()] = [0, 0, 255]corners = cv2.goodFeaturesToTrack(gray, maxCorners=100, qualityLevel=0.01, minDistance=10)
for corner in np.int0(corners):x, y = corner.ravel()cv2.circle(image, (x, y), 5, (0, 255, 0), -1)# 显示结果
cv2.imshow('Shi-Tomasi', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

▶️运行结果:

应用场景:

  • 运动跟踪(如光流跟踪)
  • 结构分析

3. Canny 边缘检测

Canny 边缘检测 主要用于提取图像中的 边缘特征,是计算机视觉中的重要工具。

核心步骤:

  1. 高斯模糊去噪。
  2. 计算梯度,检测边缘。
  3. 通过非极大值抑制减少边缘宽度。
  4. 通过双阈值去除弱边缘。

示例代码:

import cv2
import numpy as np# 读取图像并转换为灰度图
image = cv2.imread('D:\\resource\\filter\\shudu.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)edges = cv2.Canny(gray, 100, 200)
cv2.imshow('Edges', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()

▶️运行结果: 

 

应用场景:

  • 车道检测
  • 物体轮廓提取
  • OCR(光学字符识别)

4. SIFT(尺度不变特征变换)

SIFT (Scale-Invariant Feature Transform) 是一种经典的特征检测方法,具有 尺度不变性 和 旋转不变性,能够检测图像中的局部特征点,并为每个特征点生成独特的描述符。

示例代码:

import cv2
import numpy as np# 读取图像并转换为灰度图
image = cv2.imread('D:\\resource\\filter\\shudu.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)sift = cv2.SIFT_create()
keypoints, descriptors = sift.detectAndCompute(gray, None)
image_sift = cv2.drawKeypoints(image, keypoints, None)
cv2.imshow('SIFT Features', image_sift)
cv2.waitKey(0)
cv2.destroyAllWindows()

▶️运行结果:  

 

应用场景:

  • 图像匹配(如拼接全景图)
  • 物体识别
  • 机器人导航

5. ORB

ORB (Oriented FAST and Rotated BRIEF)是 SIFT 和 SURF 的高效替代方案,适用于实时应用,如移动设备上的特征检测。

示例代码:

import cv2
import numpy as np# 读取图像并转换为灰度图
image = cv2.imread('D:\\resource\\filter\\shudu.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)orb = cv2.ORB_create()
keypoints = orb.detect(gray, None)
image_orb = cv2.drawKeypoints(image, keypoints, None)
cv2.imshow('ORB Features', image_orb)
cv2.waitKey(0)
cv2.destroyAllWindows()

▶️运行结果: 

 

应用场景:

  • 低计算资源环境(如嵌入式设备)
  • 物体跟踪
  • 视觉 SLAM(同时定位与地图构建)

三、特征检测的应用场景

1. 图像匹配

  • 通过特征点匹配来识别物体,如 SIFT、ORB 可用于 拼接全景图 或 目标识别。

2. 运动检测

  • 角点检测(如 Shi-Tomasi)可用于跟踪视频中的运动物体,如 光流跟踪。

3. 自动驾驶

  • Canny 边缘检测 可用于 车道检测,ORB 可用于 视觉 SLAM。

4. 生物特征识别

  • SIFT、ORB 可用于 指纹识别、人脸识别。

四、总结

方法主要用途特点
Harris 角点角点检测计算简单,适用于运动检测
Shi-Tomasi 角点改进的角点检测适用于光流跟踪等任务
Canny 边缘边缘检测精确提取物体轮廓
SIFT关键点检测、图像匹配尺度、旋转不变,精度高
ORB关键点检测、实时匹配适合移动端,速度快

如何选择特征检测方法?

  • 如果需要快速检测角点:Shi-Tomasi、Harris。
  • 如果需要检测物体轮廓:Canny。
  • 如果需要进行图像匹配:SIFT、ORB。
  • 如果需要在低计算资源环境下运行:ORB 是更好的选择。

😀通过OpenCV提供的特征检测工具,我们可以在图像处理、目标识别、运动检测等多个领域实现高效的视觉分析。希望本篇博文能有所帮助!

相关文章:

OpenCV:特征检测总结

目录 一、什么是特征检测? 二、OpenCV 中的常见特征检测方法 1. Harris 角点检测 2. Shi-Tomasi 角点检测 3. Canny 边缘检测 4. SIFT(尺度不变特征变换) 5. ORB 三、特征检测的应用场景 1. 图像匹配 2. 运动检测 3. 自动驾驶 4.…...

Clion开发STM32时使用stlink下载程序与Debug调试

一、下载程序 先创建一个文件夹: 命名:stlink.cfg 写入以下代码: # choose st-link/j-link/dap-link etc. #adapter driver cmsis-dap #transport select swdsource [find interface/stlink.cfg]transport select hla_swdsource [find target/stm32f4x.…...

电脑开机键一闪一闪打不开

家人们谁懂啊!本来打算愉快地开启游戏时光,或者高效处理工作任务,结果按下电脑开机键后,它就只是一闪一闪的,怎么都打不开。相信不少朋友都遭遇过这种令人崩溃的场景,满心的期待瞬间化为焦急与无奈。电脑在…...

深度学习 Pytorch 基础网络手动搭建与快速实现

为了方便后续练习的展开,我们尝试自己创建一个数据生成器,用于自主生成一些符合某些条件、具备某些特性的数据集。 导入相关的包 # 随机模块 import random# 绘图模块 import matplotlib as mpl import matplotlib.pyplot as plt# 导入numpy import nu…...

Sqli-labs靶场实录(一):Basic Challenges

sqli-labs靶场实录:Basic Challenges sql手注基本流程Less-11.1探测注入点1.2判断字段数1.3判断回显位1.4提取数据库基本信息1.5拖取敏感数据 Less-2Less-3Less-4Less5爆表爆列名 Less6爆库爆表爆列名 Less7猜解数据库长度逐字符爆破数据库名 Less8爆库 Less9爆库 Less10Less11…...

2024最新版Node.js详细安装教程(含npm配置淘宝最新镜像地址)

一:Node.js安装 浏览器中搜索Nodejs,或直接用网址:Node.js — 在任何地方运行 JavaScript 建议此处下载长期支持版本(红框内): 开始下载,完成后打开文件: 进入安装界面,在此处勾选,再点击n…...

RK3568使用QT搭建TCP服务器和客户端

文章目录 一、让RK3568开发板先连接上wifi二、客户端代码1. `widget.h` 文件2. `widget.cpp` 文件**详细讲解**1. **`Widget` 类构造函数 (`Widget::Widget`)**2. **UI 布局 (`setupUI`)**3. **连接按钮的槽函数 (`onConnectClicked`)**4. **发送消息按钮的槽函数 (`onSendMess…...

Android学习20 -- 手搓App2(Gradle)

1 前言 昨天写了一个完全手搓的:Android学习19 -- 手搓App-CSDN博客 后面谷歌说不要用aapt,d8这些来搞。其实不想弄Gradle的,不过想着既然开始了,就多看一些。之前写过一篇Gradle,不过是最简单的编译,不涉…...

LeetCode - Google 大模型10题 第2天 Position Embedding(位置编码) 3题

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/145454489 在 Transformer 架构中,位置编码(Position Embedding) 是辅助模型理解序列中元素顺序的关键机制。绝对位置编码(Absolute P…...

PostgreSQL 数据库备份与还原

为了安全与数据共享等,创建好的数据库有时候需要备份操作和还原操作。数据库的备份与还原主要是三个命令:pg_dump、pg_dumpall 和 pg_restore 。 其中pg_dump用于备份单个数据库,它支持多种备份格式(SQL、自定义等)&a…...

proxmox通过更多的方式创建虚拟机

概述 作为一名资深运维工程师,我们经常需要在 Proxmox 虚拟化平台上创建和管理虚拟机。本文将介绍三种不同的方式在 Proxmox 上创建 Ubuntu 虚拟机: 通过 Proxmox 命令创建虚拟机通过 Shell 脚本自动化创建虚拟机使用 Proxmox API 创建虚拟机 每种方式…...

WordPress使用(2)

上一篇文章讲述了WordPress的基本安装,主要是docker方式的处理。本文章主要介绍WordPress安装后的其他设置。 1. 安装后设置 安装后碰到的第一个需求就是安装一个合适的主题,但WordPress默认的上传文件大小是2M,远远无法满足要求&#xff0…...

git中文件的状态状态切换

文件的状态分类 Git 中文件的状态主要分为以下几种: Untracked(未跟踪) 定义:这些文件从未被 Git 跟踪过,通常是因为它们是新创建的文件,或者被 .gitignore 排除在外。 示例:新创建的文件 new…...

解决php8.3无法加载curl扩展

把它的值更改为扩展存在的目录的绝对路径(扩展存在的目录为有php_xxx.dll存在的目录) extension_dir "e:\serv\php83\ext" 然后从php根目录复制 libssh2.dll 和 libcrypto-*.dll 和 libssl-*.dll 到Apache根目录下的bin目录 重启apache服务即可...

三路排序算法

三路排序算法 引言 排序算法是计算机科学中基础且重要的算法之一。在数据分析和处理中,排序算法的效率直接影响着程序的执行速度和系统的稳定性。本文将深入探讨三路排序算法,包括其原理、实现和应用场景。 一、三路排序算法的原理 三路排序算法是一…...

入行FPGA设计工程师需要提前学习哪些内容?

FPGA作为一种灵活可编程的硬件平台,广泛应用于嵌入式系统、通信、数据处理等领域。很多人选择转行FPGA设计工程师,但对于新手来说,可能在学习过程中会遇到一些迷茫和困惑。为了帮助大家更好地准备,本文将详细介绍入行FPGA设计工程…...

DBASE DBF数据库文件解析

基于Java实现DBase DBF文件的解析和显示 JDK19编译运行,实现了数据库字段和数据解析显示。 首先解析数据库文件头代码 byte bytes[] Files.readAllBytes(Paths.get(file));BinaryBufferArray bis new BinaryBufferArray(bytes);DBF dbf new DBF();dbf.VersionN…...

html基本结构和常见元素

html5文档基本结构 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>文档标题</title> </head> <body>文档正文部分 </body> </html> html文档可分为文档头和文档体…...

JAVAweb学习日记(十) Mybatis入门操作

一、介绍 二、快速入门程序 三、入门-数据库连接池 四、入门-lombok工具包...

从Transformer到世界模型:AGI核心架构演进

文章目录 引言&#xff1a;架构革命推动AGI进化一、Transformer&#xff1a;重新定义序列建模1.1 注意力机制的革命性突破1.2 从NLP到跨模态演进1.3 规模扩展的黄金定律 二、通向世界模型的关键跃迁2.1 从语言模型到认知架构2.2 世界模型的核心特征2.3 混合架构的突破 三、构建…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行&#xff01; sudo su - 1. CentOS 系统&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列&#xff1f;2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

解读《网络安全法》最新修订,把握网络安全新趋势

《网络安全法》自2017年施行以来&#xff0c;在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂&#xff0c;网络攻击、数据泄露等事件频发&#xff0c;现行法律已难以完全适应新的风险挑战。 2025年3月28日&#xff0c;国家网信办会同相关部门起草了《网络安全…...

Qemu arm操作系统开发环境

使用qemu虚拟arm硬件比较合适。 步骤如下&#xff1a; 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载&#xff0c;下载地址&#xff1a;https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...

面试高频问题

文章目录 &#x1f680; 消息队列核心技术揭秘&#xff1a;从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"&#xff1f;性能背后的秘密1.1 顺序写入与零拷贝&#xff1a;性能的双引擎1.2 分区并行&#xff1a;数据的"八车道高速公路"1.3 页缓存与批量处理…...

解析两阶段提交与三阶段提交的核心差异及MySQL实现方案

引言 在分布式系统的事务处理中&#xff0c;如何保障跨节点数据操作的一致性始终是核心挑战。经典的两阶段提交协议&#xff08;2PC&#xff09;通过准备阶段与提交阶段的协调机制&#xff0c;以同步决策模式确保事务原子性。其改进版本三阶段提交协议&#xff08;3PC&#xf…...