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

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


http://www.kler.cn/a/534371.html

相关文章:

  • 使用线性回归模型逼近目标模型 | PyTorch 深度学习实战
  • 【蓝桥杯嵌入式】2_LED
  • Ollama本地搭建大模型
  • 49【服务器介绍】
  • 排序算法--插入排序
  • 高等代数笔记—域与一元多项式
  • k8s服务发现有哪些方式?
  • 【产品小白】什么是微服务
  • 基于微信小程序的课堂点名系统springboot+论文源码调试讲解
  • AURIX TC275学习笔记3 官方例程 (UART LED WDT)
  • mysql和oracle取Group By 第一条
  • AI推理性能之王-Groq公司开发的LPU芯片
  • vue 弹窗 模板
  • 人工智能|本地部署|ollama+chatbox快速Windows10下部署(初级篇)
  • 深度剖析 Veo2 工具:解锁 AI 视频创作新境界
  • RabbitMQ 可靠性投递
  • 理解 C 与 C++ 中的 const 常量与数组大小的关系
  • 【C++】STL——list的使用
  • 【数据结构】链表应用1
  • java中反射(Reflection)的4个作用
  • [Python人工智能] 四十九.PyTorch入门 (4)利用基础模块构建神经网络并实现分类预测
  • 我的鸿蒙学习之旅:探索万物互联的新宇宙
  • 产品经理的人工智能课 02 - 自然语言处理
  • 穷举vs暴搜vs深搜vs回溯vs剪枝系列一>黄金矿工
  • 移动机器人规划控制入门与实践:基于navigation2 学习笔记(一)
  • 【Uniapp-Vue3】从uniCloud中获取数据