OpenCV:特征检测总结

news/2025/2/2 9:18:38/

目录

一、什么是特征检测?

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


http://www.ppmy.cn/news/1568658.html

相关文章

从零开始构建一个JAVA项目

本篇文章将从结构框架入手,系统介绍一个完整Java程序的结构步骤,不涉及JAVA基础代码学习。 在本文章中先简单介绍Maven、Spring、MyBatis三种Java类型。 一、分类介绍 首先我们先来了解Java程序的类型,不同类型结构略有区别。Java程序的类型…

arkui-x 页面封装为自定义组件,巧用controller

鸿蒙开发中,有时会需要将某些页面封装为自定义组件,方便复用。 页面的入口为: Entry Componentstruct XXX { 。。。。。。 自定义组件的入口为: Component export struct XXXX { 。。。。。。 但是页面与自定义组件在生命周期…

Python-基于PyQt5,pdf2docx,pathlib的PDF转Word工具

前言:日常生活中,我们常常会跟WPS Office打交道。作表格,写报告,写PPT......可以说,我们的生活已经离不开WPS Office了。与此同时,我们在这个过程中也会遇到各种各样的技术阻碍,例如部分软件的PDF转Word需要收取额外费用等。那么,可不可以自己开发一个小工具来实现PDF转…

Python NumPy(6):修改数组形状、翻转数组、修改数组维度

1 修改数组形状 函数描述reshape不改变数据的条件下修改形状flat数组元素迭代器flatten返回一份数组拷贝,对拷贝所做的修改不会影响原始数组ravel返回展开数组 1.1 numpy.reshape numpy.reshape 函数可以在不改变数据的条件下修改形状,格式如下&#x…

【C++】string类使用详解

目录 💕1.string类 💕3. String基本功能(1)(2)讲解 💕4.sting类基本功能(3) 讲解 💕5.string类基本功能(4) (拷贝构造函数) &#x1…

android 圆形弹窗摄像头开发踩坑——源码————未来之窗跨平台操作

一、飘窗刷脸&#xff0c;拍照采用飘窗 刷脸认证安卓接口采用飘窗具有在不干扰用户主要操作的前提下以醒目方式引导用户完成认证&#xff0c;且能灵活定制样式以提升用户体验和认证效率的优点 二、踩坑只有一个扇形 <?xml version"1.0" encoding"utf-8&quo…

第27篇:Python开发进阶:python多线程与多进程编程

第27篇&#xff1a;多线程与多进程编程 目录 并发编程概述 什么是并发编程多线程与多进程的区别 多线程编程 线程的基本概念创建和管理线程线程同步与锁 多进程编程 进程的基本概念创建和管理进程进程间通信 线程与进程的比较全局解释器锁&#xff08;GIL&#xff09; GIL的影…

【MySQL】数据类型与表约束

目录 数据类型分类 数值类型 tinyint类型 bit类型 小数类型 字符串类型 日期和时间类型 enum和set 表的约束 空属性 默认值 列描述 zerofill 主键 自增长 唯一键 外键 数据类型分类 数值类型 tinyint类型 MySQL中&#xff0c;整形可以是有符号和无符号的&…