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

OpenCV计算机视觉实战(17)——特征点检测详解

OpenCV计算机视觉实战(17)——特征点检测详解

    • 0. 前言
    • 1. Harris 角点检测
      • 1.1 应用场景
      • 1.2 实现过程
    • 2. Shi-Tomasi 算法
      • 2.1 应用场景
      • 2.2 实现过程
    • 3. 亚像素级角点
      • 3.1 应用场景
      • 3.2 实现过程
    • 小结
    • 系列链接

0. 前言

在计算机视觉中,角点 (Corner, 也称特征点) 是图像中特征信息最丰富的点,对应周围像素灰度在两个正交方向均有显著变化。准确检测并定位角点,对于后续的图像配准、运动跟踪和三维重建等任务至关重要。本文将介绍并实现经典的 Harris 角点检测、改进的 Shi-Tomasi 算法以及亚像素级角点优化。

1. Harris 角点检测

Harris 算法基于自相关矩阵,对图像每个像素邻域的灰度变化进行二阶矩分析,当两个正交方向都发生大变化时,该像素即为角点。

1.1 应用场景

  • 摄像头标定:角点分布均匀、特征明显,便于内参求解
  • 纹理分析:建筑、机械表面角点多,能辅助表面缺陷检测
  • 目标跟踪:对比边缘,角点更易在变形、遮挡下保持稳定

1.2 实现过程

  • 读取图像并灰度化
  • 计算图像梯度:使用 Sobel 算子分别获取 IxI_xIx, IyI_yIy
  • 构建自相关矩阵
    M=(∑wIx2∑wIxIy∑wIxIy∑wIy2)M= \begin{pmatrix}∑w I_x^2&∑w I_xI_y\\ ∑w I_xI_y&∑w I_y^2 \end{pmatrix}M=(wIx2wIxIywIxIywIy2)
    其中 www 是高斯窗口
  • 计算响应函数
    R=det⁡(M)−k(trace(M))2R=det⁡(M)−k (trace(M))^2R=det(M)k(trace(M))2
    kkk 常取 0.04–0.06
  • 非极大值抑制与阈值筛选:保留局部最大且 RRR 大于阈值的点
import cv2
import numpy as np# 功能:Harris 角点检测并可视化
img = cv2.imread('1.jpeg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray = np.float32(gray)# 1. 直接调用 OpenCV Harris
dst = cv2.cornerHarris(src=gray, blockSize=2, ksize=3, k=0.06)# 2. 扩大标记区域并阈值化
dst = cv2.dilate(dst, None)
corners = dst > 0.01 * dst.max()# 3. 在原图中标记角点
output = img.copy()
output[corners] = [0, 0, 255]cv2.imshow('Harris Corners', output)
cv2.waitKey(0)
cv2.destroyAllWindows()

Harris

  • cv2.cornerHarris(src, blockSize, ksize, k)
    • blockSize:角点检测时考察邻域大小
    • ksizeSobel 求导算子大小
    • kHarris 参数,控制响应函数的敏感度
  • cv2.dilate(src, kernel):对检测响应图进行膨胀,便于后续非极大值检测
  • 阈值筛选 (dst > thresh):保留响应值较大的角点

2. Shi-Tomasi 算法

Shi-Tomasi 算法在 Harris 基础上,使用自相关矩阵的最小特征值 ⁡λmin⁡λ_{min}λmin​ 作为角点响应,更稳定、无需调参 kkk

2.1 应用场景

  • 移动目标跟踪:Shi-Tomasi 的最小特征值度量更稳定,常用作金字塔光流跟踪的初始化点
  • 机器人导航:室内房间角落、门框角点分布稀疏,用少量高质量特征即可定位
  • 图像拼接:特征点质量与分布影响拼接精度,Shi-Tomasi 质量水平可控制点的可靠性

2.2 实现过程

  • 读取与灰度化
  • 直接调用 goodFeaturesToTrack,传入最大角点数、质量水平、最小距离等参数
  • 可选:在每个角点处绘制圆圈以便可视化
import cv2
import numpy as np# 功能:Shi-Tomasi 角点检测并可视化
img = cv2.imread('1.jpeg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 1. 调用 OpenCV Shi-Tomasi
corners = cv2.goodFeaturesToTrack(image=gray,maxCorners=200,qualityLevel=0.01,minDistance=10,blockSize=3
)
corners = np.int0(corners)# 2. 可视化
output = img.copy()
for x, y in corners.reshape(-1, 2):cv2.circle(output, (x, y), 4, (0, 255, 0), -1)cv2.imshow('Shi-Tomasi Corners', output)
cv2.waitKey(0)
cv2.destroyAllWindows()

Shi-Tomasi

关键函数解析:

  • cv2.goodFeaturesToTrack(image, maxCorners, qualityLevel, minDistance, blockSize)
    • maxCorners:返回角点的最大数量
    • qualityLevel:角点质量阈值,相当于最小 λmin⁡/λmaxλ_{min}⁡/λ_{max}λmin⁡/λmax
    • minDistance:角点之间的最小欧氏距离
    • blockSize:计算自相关矩阵的邻域大小

3. 亚像素级角点

在图像金字塔与光流等任务中,亚像素级别的角点位置能显著提升跟踪与配准精度。通过 cornerSubPix 方法,利用灰度图在小窗口内对角点坐标做迭代优化。

3.1 应用场景

  • 立体匹配:亚像素精度可显著提升深度图分辨率
  • 显微镜图像:细胞或晶体内微小角点需精确定位
  • 机械误差测量:高精度角点抠图,辅助工业检测与校准

3.2 实现过程

  • 先用 Shi-Tomasi 得到粗略角点
  • 定义搜索窗口大小与终止条件
  • 调用 cornerSubPix,传入灰度图、初始角点、窗口大小与停止迭代条件
  • 查看亚像素精度坐标
import cv2
import numpy as np# 功能:Shi-Tomasi + 亚像素角点优化
img = cv2.imread('1.jpeg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 1. 原始角点
corners = cv2.goodFeaturesToTrack(gray, 100, 0.01, 10)
corners = np.float32(corners)# 2. 设置优化参数
winSize = (5, 5)
zeroZone = (-1, -1)
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 40, 0.001)# 3. 亚像素优化
corners_refined = cv2.cornerSubPix(image=gray,corners=corners,winSize=winSize,zeroZone=zeroZone,criteria=criteria
)# 4. 可视化
output = img.copy()
for x, y in corners_refined.reshape(-1, 2):cv2.circle(output, (int(x), int(y)), 3, (255, 0, 0), -1)cv2.imshow('Subpixel Corners', output)
cv2.waitKey(0)
cv2.destroyAllWindows()

subpixel

关键函数解析:

  • cv2.cornerSubPix(image, corners, winSize, zeroZone, criteria)
    • corners:输入初始角点位置
    • winSize:搜索窗口大小
    • zeroZone:窗口中不参与计算的中心区域
    • criteria:迭代终止条件,组合了最大迭代次数与精度阈值

小结

角点作为图像中信息密度最高的特征点,在计算机视觉任务中扮演着至关重要的角色。本文介绍了三种常用的角点检测方法:Harris 算法以响应函数衡量角点强度,适合特征丰富场景;Shi-Tomasi 算法通过最小特征值选择更稳定的角点,更适用于后续跟踪与匹配;而亚像素角点优化则进一步提升了检测精度,满足高精度应用需求。

系列链接

OpenCV计算机视觉实战(1)——计算机视觉简介
OpenCV计算机视觉实战(2)——环境搭建与OpenCV简介
OpenCV计算机视觉实战(3)——计算机图像处理基础
OpenCV计算机视觉实战(4)——计算机视觉核心技术全解析
OpenCV计算机视觉实战(5)——图像基础操作全解析
OpenCV计算机视觉实战(6)——经典计算机视觉算法
OpenCV计算机视觉实战(7)——色彩空间详解
OpenCV计算机视觉实战(8)——图像滤波详解
OpenCV计算机视觉实战(9)——阈值化技术详解
OpenCV计算机视觉实战(10)——形态学操作详解
OpenCV计算机视觉实战(11)——边缘检测详解
OpenCV计算机视觉实战(12)——图像金字塔与特征缩放
OpenCV计算机视觉实战(13)——轮廓检测详解
OpenCV计算机视觉实战(14)——直方图均衡化
OpenCV计算机视觉实战(15)——霍夫变换详解
OpenCV计算机视觉实战(16)——图像分割技术

http://www.dtcms.com/a/295476.html

相关文章:

  • 基于python django的农业可视化系统,以奶牛牧场为例
  • 3D Semantic Occupancy Prediction
  • 行业热点丨SimLab解决方案如何高效应对3D IC多物理场与ECAD建模挑战?
  • Redis学习:持久化与事务(Transaction)
  • Three.js 光照系统详解:打造真实的 3D 光影世界
  • Django Models详解:数据库模型的核心
  • HOOPS Communicator详解:基于WebGL的3D Web可视化引擎架构与核心模块
  • 【OpenCV篇】OpenCV——03day.图像预处理(2)
  • 阿里视频直播解决方案VS(MediaMTX + WebRTC) 流媒体解决方案
  • 2025年区块链安全威胁全景:新兴漏洞、攻击向量与防护策略深度解析
  • TimeXer - 重新审视时序预测内的外生变量
  • 算法题(179):单调栈
  • 接口多态之我的误解
  • C# system.diagnostics.debug.writeline 不在输出窗口显示
  • Java学习第七十二部分——Zookeeper
  • 适配器模式——以springboot为例
  • RustDesk 完整部署教程:支持 Web 管理后台和网页客户端远程,保姆级教学来了!
  • 【SpringAI实战】提示词工程实现哄哄模拟器
  • Mybatis_2
  • 5.1 神经元、神经网络的理解
  • AI大模型各类概念扫盲
  • 鸿蒙平台运行Lua脚本
  • easyexcel流式导出
  • 100元以下的儿童益智玩具推荐
  • 达梦数据库集群启停顺序全解析
  • GitHub开源项目Zerox:AI驱动的OCR革命
  • 5G-RAN与语义通信RAN
  • 社区资源媒体管理系统设计与实现
  • Spring Boot 遇上 MyBatis-Plus:高效开发的奇妙之旅
  • IO密集型、CPU密集型、负载、负载均衡