基于opencv的HOG+角点匹配教程
1. 引言
在计算机视觉任务中,特征匹配是目标识别、图像配准和物体跟踪的重要组成部分。本文介绍如何使用 HOG(Histogram of Oriented Gradients,方向梯度直方图) 和 角点检测(Corner Detection) 进行特征匹配。
1.1 为什么选择HOG和角点?
- HOG特征 适用于物体检测,能够提取局部梯度信息,具有旋转和光照不变性。
- 角点检测 例如Harris角点、Shi-Tomasi等方法,能够找到图像中结构突变的关键点,提高匹配精度。
- 结合HOG与角点检测,可以同时利用纹理信息和几何信息,提高匹配的鲁棒性。
2. HOG特征提取
2.1 HOG的基本原理
HOG的基本思想是计算局部区域内像素梯度的方向分布,并构建特征向量。
HOG计算步骤:
- 计算梯度:使用Sobel算子计算水平梯度 ( G_x ) 和垂直梯度 ( G_y )。
- 计算梯度幅值和方向:
[ M = \sqrt{G_x^2 + G_y^2} ]
[ \theta = \tan^{-1}(G_y / G_x) ] - 划分细胞(Cells):将图像划分为小的单元格(例如 8×8)。
- 计算直方图:在每个Cell中统计不同方向的梯度强度。
- 块归一化(Block Normalization):对多个Cells组成的Block进行归一化,以增强光照变化的鲁棒性。
- 特征向量拼接:将所有Block的特征向量拼接成最终的HOG描述子。
2.2 代码示例
使用OpenCV和hog库提取HOG特征。
import cv2
import numpy as np
from skimage.feature import hogdef compute_hog(image):gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)features, hog_image = hog(gray, orientations=9, pixels_per_cell=(8, 8),cells_per_block=(2, 2), visualize=True, feature_vector=True)return features, hog_imageimage = cv2.imread('image.jpg')
hog_features, hog_vis = compute_hog(image)
cv2.imshow('HOG Features', hog_vis)
cv2.waitKey(0)
cv2.destroyAllWindows()
3. 角点检测
3.1 角点检测原理
角点是图像中具有显著变化的点,在特征匹配中至关重要。常用角点检测方法:
- Harris角点检测:基于自相关矩阵,计算图像窗口内的梯度变化。
- Shi-Tomasi角点检测:改进Harris方法,选择响应更强的角点。
- FAST角点检测:基于快速关键点检测,适用于实时应用。
3.2 代码示例
使用OpenCV实现Harris角点检测。
import cv2
import numpy as npdef detect_corners(image):gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)gray = np.float32(gray)corners = cv2.cornerHarris(gray, blockSize=2, ksize=3, k=0.04)image[corners > 0.01 * corners.max()] = [0, 0, 255] # 标记角点return imageimage = cv2.imread('image.jpg')
detected_image = detect_corners(image)
cv2.imshow('Corners', detected_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
4. HOG+角点匹配
4.1 结合HOG和角点检测
HOG提取局部特征,而角点提供关键匹配点,可以使用 最近邻搜索(Nearest Neighbor Search, NNS) 或 FLANN(Fast Library for Approximate Nearest Neighbors) 进行匹配。
4.2 代码示例
import cv2
import numpy as np
from skimage.feature import hog
from scipy.spatial import distancedef extract_hog_at_corners(image, corners):gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)features = []for corner in np.argwhere(corners > 0.01 * corners.max()):x, y = corner[1], corner[0]patch = gray[max(y-8, 0):min(y+8, gray.shape[0]), max(x-8, 0):min(x+8, gray.shape[1])]if patch.shape[0] == 16 and patch.shape[1] == 16:hog_feature = hog(patch, orientations=9, pixels_per_cell=(8, 8), cells_per_block=(2, 2), feature_vector=True)features.append((x, y, hog_feature))return featuresdef match_features(features1, features2):matches = []for (x1, y1, f1) in features1:best_match = min(features2, key=lambda f2: distance.euclidean(f1, f2[2]))x2, y2, _ = best_matchmatches.append(((x1, y1), (x2, y2)))return matches# 读取两张待匹配图像
image1 = cv2.imread('image1.jpg')
image2 = cv2.imread('image2.jpg')# 角点检测
corners1 = cv2.cornerHarris(cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY).astype(np.float32), 2, 3, 0.04)
corners2 = cv2.cornerHarris(cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY).astype(np.float32), 2, 3, 0.04)# 提取HOG特征
features1 = extract_hog_at_corners(image1, corners1)
features2 = extract_hog_at_corners(image2, corners2)# 进行匹配
matches = match_features(features1, features2)# 可视化匹配结果
for (pt1, pt2) in matches:cv2.line(image1, pt1, pt2, (0, 255, 0), 1)cv2.imshow('Matched Features', image1)
cv2.waitKey(0)
cv2.destroyAllWindows()
5. 优化策略
- 使用FLANN加速匹配
- 结合RANSAC剔除错误匹配
- 多尺度金字塔提高匹配稳定性
6. 结论
HOG结合角点检测能够在图像匹配任务中提供高鲁棒性的特征描述。适用于目标识别、拼接和物体跟踪等应用。
参考资料
- Dalal & Triggs, “Histograms of Oriented Gradients for Human Detection”, CVPR 2005.
- OpenCV 官方文档 https://docs.opencv.org
相关文章:
基于opencv的HOG+角点匹配教程
1. 引言 在计算机视觉任务中,特征匹配是目标识别、图像配准和物体跟踪的重要组成部分。本文介绍如何使用 HOG(Histogram of Oriented Gradients,方向梯度直方图) 和 角点检测(Corner Detection) 进行特征匹…...
Linux线程概念与线程操作
Linux线程概念与线程操作 线程概念 前面提到进程程序代码和数据进程结构体,在线程部分就需要进一步更新之前的认识 进程实际上承担分配系统资源的基本实体,而线程是进程中的一个执行分支,是操作系统调度的基本单位 此处需要注意࿰…...
AI软件栈:LLVM分析(五)
数据流分析是编译优化、代码生成的关键理论。其数学基础是离散数学中的半格(Semi-Lattice)和格。半格与格不仅是编译优化和代码生成的重要理论基础,也是程序分析、验证及自动化测试的系统理论基础。 文章目录 格、半格与不动点格、半格与不动点 半格是指针对二元组 < S …...
Git指南-从入门到精通
代码提交和同步命令 流程图如下: 第零步: 工作区与仓库保持一致第一步: 文件增删改,变为已修改状态第二步: git add ,变为已暂存状态 bash $ git status $ git add --all # 当前项目下的所有更改 $ git add . # 当前目录下的所有更改 $ g…...
Linux 文件系统挂载
系列文章目录 Linux内核学习 Linux 知识(1) Linux 知识(2) WSL Ubuntu QEMU 虚拟机 Linux 调试视频 PCIe 与 USB 的补充知识 vscode 使用说明 树莓派 4B 指南 设备驱动畅想 Linux内核子系统 Linux 文件系统挂载 文章目录 系列文章…...
Qt QSpinBox 总结
Qt5 QSpinBox 总结 1. 基本特性 用途:用于输入和调整整数值,支持通过上下箭头、键盘输入或编程方式修改值。 默认范围:0 到 99,可通过 setRange(min, max) 自定义。 步长控制:setSingleStep(step) 设置单步增减值&a…...
【OJ项目】深入剖析题目接口控制器:功能、实现与应用
《深入剖析题目接口控制器:功能、实现与应用》 一、引言 在在线编程平台或竞赛系统中,题目管理和提交是核心功能之一。QuestionController 类作为控制器层,承担着处理与题目相关的各种请求的重要职责,包括题目的增删改查、题目提…...
周考考题(学习自用)
1.查询student表中name叫张某的信息 select * from student where name张某; 2.写出char和varchar类型的区别 1)char存储固定长度的字符串,varchar存储可变长度的字符串(在实际长度的字符串上加上一个字节用于存储字符串长度)&a…...
【matlab】大小键盘对应的Kbname
matlab中可以通过Kbname来识别键盘上的键。在写范式的时候,遇到一个问题,我想用大键盘上排成一行的数字按键评分,比如 Kbname(1) 表示键盘上的数字1,但是这种写法只能识别小键盘上的数字,无法达到我的目的,…...
LabVIEW与小众设备集成
在LabVIEW开发中,当面临控制如布鲁克OPUS红外光谱仪这类小众专业设备的需求,而厂家虽然提供了配套软件,但由于系统中还需要控制其他设备且不能使用厂商的软件时,必须依赖特定方法通过LabVIEW实现设备的控制。开发过程中࿰…...
Android 系统Service流程
主要用到的源码文件 /frameworks/base/core/java/android/app/ContextImpl.java 和ams通信。 /frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java 初始化Service,.管理服务 ActiveServices对象mServices /frameworks/base/services/core/…...
Gartner预测2025年网络安全正在进入AI动荡时期:软件供应链和基础设施技术堆栈中毒将占针对企业使用的人工智能恶意攻击的 70% 以上
Gartner 预测,网络安全正在进入 AI 动荡时期。安全和风险管理领导者必须根据早期生成式 AI 部署的失败以及 AI 代理清洗来评估即将到来的 AI 进展。 主要发现 随着各大企业开展大量人工智能采用和开发项目,应用安全弱点的暴露程度不断提高,包…...
华为最新OD机试真题-最长子字符串的长度(一)-Python-OD统一考试(E卷)
最新华为OD机试考点合集:华为OD机试2024年真题题库(E卷+D卷+C卷)_华为od机试题库-CSDN博客 每一题都含有详细的解题思路和代码注释,精编c++、JAVA、Python三种语言解法。帮助每一位考生轻松、高效刷题。订阅后永久可看,发现新题及时跟新。 题目描述: 给你一个字符串…...
HAL库框架学习总结
概述:HAL库为各种外设基本都配了三套 API,查询,中断和 DMA。 一、HAL库为外设初始化提供了一套框架,这里以串口为例进行说明,调用函数 HAL_UART_Init初始化串口,此函数就会调用 HAL_UART_MspInit࿰…...
基于Spring Integration的ESB与Kettle结合实现实时数据处理技术
一、方案概述 在当今数字化时代,企业面临着海量数据的实时处理与传输挑战。ESB(企业服务总线)作为系统集成的核心组件,承担着不同协议数据的接入与转换任务,而Kettle作为一款功能强大的ETL(Extract, Transform, Load)工具,在数据抽取、转换与加载方面表现出色。将ESB与…...
qt QOpenGLContext详解
1. 概述 QOpenGLContext 是 Qt 提供的一个类,用于管理 OpenGL 上下文。它封装了 OpenGL 上下文的创建、配置和管理功能,使得开发者可以在 Qt 应用程序中以平台无关的方式使用 OpenGL。通过 QOpenGLContext,可以轻松地创建和管理 OpenGL 上下…...
探索顶级汽车软件解决方案:驱动行业变革的关键力量
在本文中,将一同探索当今塑造汽车行业的最具影响力的软件解决方案。从设计到制造,软件正彻底改变车辆的制造与维护方式。让我们深入了解这个充满活力领域中的关键技术。 设计软件:创新车型的孕育摇篮 车辆设计软件对于创造创新型汽车模型至…...
Deepseek R1模型本地化部署+API接口调用详细教程:释放AI生产力
文章目录 前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装ollama2部署DeepSeek R1模型删除已存在模型,以7b模型为例 三、DeepSeek API接口调用Cline配置 前言 随着最近人工智能 DeepSeek 的爆火,越来越多的技术大佬们开始关注如…...
DeepSeek 概述与本地化部署【详细流程】
目录 一、引言 1.1 背景介绍 1.2 本地化部署的优势 二、deepseek概述 2.1 功能特点 2.2 核心优势 三、本地部署流程 3.1 版本选择 3.2 部署过程 3.2.1 下载Ollama 3.2.2 安装Ollama 3.2.3 选择 r1 模型 3.2.4 选择版本 3.2.5 本地运行deepseek模型 3.3.6 查看…...
FFmpeg Video options
FFmpeg视频相关选项 1. -vframes number (output) 设置输出视频帧数 示例: ffmpeg -i input.mp4 -vframes 90 output.mp4 表示输出90帧视频 2. -r[:stream_specifier] fps (input/output,per-stream) 设置帧率(rate) 示例: ffmpeg -i input.mp4…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...
华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...
宇树科技,改名了!
提到国内具身智能和机器人领域的代表企业,那宇树科技(Unitree)必须名列其榜。 最近,宇树科技的一项新变动消息在业界引发了不少关注和讨论,即: 宇树向其合作伙伴发布了一封公司名称变更函称,因…...
适应性Java用于现代 API:REST、GraphQL 和事件驱动
在快速发展的软件开发领域,REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名,不断适应这些现代范式的需求。随着不断发展的生态系统,Java 在现代 API 方…...
