基于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…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...

高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...

在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...

均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...