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

基于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计算步骤:

  1. 计算梯度:使用Sobel算子计算水平梯度 ( G_x ) 和垂直梯度 ( G_y )。
  2. 计算梯度幅值和方向
    [ M = \sqrt{G_x^2 + G_y^2} ]
    [ \theta = \tan^{-1}(G_y / G_x) ]
  3. 划分细胞(Cells):将图像划分为小的单元格(例如 8×8)。
  4. 计算直方图:在每个Cell中统计不同方向的梯度强度。
  5. 块归一化(Block Normalization):对多个Cells组成的Block进行归一化,以增强光照变化的鲁棒性。
  6. 特征向量拼接:将所有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线程概念与线程操作 线程概念 前面提到进程程序代码和数据进程结构体,在线程部分就需要进一步更新之前的认识 进程实际上承担分配系统资源的基本实体,而线程是进程中的一个执行分支,是操作系统调度的基本单位 此处需要注意&#xff0…...

AI软件栈:LLVM分析(五)

数据流分析是编译优化、代码生成的关键理论。其数学基础是离散数学中的半格(Semi-Lattice)和格。半格与格不仅是编译优化和代码生成的重要理论基础,也是程序分析、验证及自动化测试的系统理论基础。 文章目录 格、半格与不动点格、半格与不动点 半格是指针对二元组 < S …...

Git指南-从入门到精通

代码提交和同步命令 流程图如下&#xff1a; 第零步: 工作区与仓库保持一致第一步: 文件增删改&#xff0c;变为已修改状态第二步: git add &#xff0c;变为已暂存状态 bash $ git status $ git add --all # 当前项目下的所有更改 $ git add . # 当前目录下的所有更改 $ g…...

Linux 文件系统挂载

系列文章目录 Linux内核学习 Linux 知识&#xff08;1&#xff09; Linux 知识&#xff08;2&#xff09; WSL Ubuntu QEMU 虚拟机 Linux 调试视频 PCIe 与 USB 的补充知识 vscode 使用说明 树莓派 4B 指南 设备驱动畅想 Linux内核子系统 Linux 文件系统挂载 文章目录 系列文章…...

Qt QSpinBox 总结

Qt5 QSpinBox 总结 1. 基本特性 用途&#xff1a;用于输入和调整整数值&#xff0c;支持通过上下箭头、键盘输入或编程方式修改值。 默认范围&#xff1a;0 到 99&#xff0c;可通过 setRange(min, max) 自定义。 步长控制&#xff1a;setSingleStep(step) 设置单步增减值&a…...

【OJ项目】深入剖析题目接口控制器:功能、实现与应用

《深入剖析题目接口控制器&#xff1a;功能、实现与应用》 一、引言 在在线编程平台或竞赛系统中&#xff0c;题目管理和提交是核心功能之一。QuestionController 类作为控制器层&#xff0c;承担着处理与题目相关的各种请求的重要职责&#xff0c;包括题目的增删改查、题目提…...

周考考题(学习自用)

1.查询student表中name叫张某的信息 select * from student where name张某; 2.写出char和varchar类型的区别 1&#xff09;char存储固定长度的字符串&#xff0c;varchar存储可变长度的字符串&#xff08;在实际长度的字符串上加上一个字节用于存储字符串长度&#xff09;&a…...

【matlab】大小键盘对应的Kbname

matlab中可以通过Kbname来识别键盘上的键。在写范式的时候&#xff0c;遇到一个问题&#xff0c;我想用大键盘上排成一行的数字按键评分&#xff0c;比如 Kbname(1) 表示键盘上的数字1&#xff0c;但是这种写法只能识别小键盘上的数字&#xff0c;无法达到我的目的&#xff0c;…...

LabVIEW与小众设备集成

在LabVIEW开发中&#xff0c;当面临控制如布鲁克OPUS红外光谱仪这类小众专业设备的需求&#xff0c;而厂家虽然提供了配套软件&#xff0c;但由于系统中还需要控制其他设备且不能使用厂商的软件时&#xff0c;必须依赖特定方法通过LabVIEW实现设备的控制。开发过程中&#xff0…...

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 预测&#xff0c;网络安全正在进入 AI 动荡时期。安全和风险管理领导者必须根据早期生成式 AI 部署的失败以及 AI 代理清洗来评估即将到来的 AI 进展。 主要发现 随着各大企业开展大量人工智能采用和开发项目&#xff0c;应用安全弱点的暴露程度不断提高&#xff0c;包…...

华为最新OD机试真题-最长子字符串的长度(一)-Python-OD统一考试(E卷)

最新华为OD机试考点合集:华为OD机试2024年真题题库(E卷+D卷+C卷)_华为od机试题库-CSDN博客 每一题都含有详细的解题思路和代码注释,精编c++、JAVA、Python三种语言解法。帮助每一位考生轻松、高效刷题。订阅后永久可看,发现新题及时跟新。 题目描述: 给你一个字符串…...

HAL库框架学习总结

概述&#xff1a;HAL库为各种外设基本都配了三套 API&#xff0c;查询&#xff0c;中断和 DMA。 一、HAL库为外设初始化提供了一套框架&#xff0c;这里以串口为例进行说明&#xff0c;调用函数 HAL_UART_Init初始化串口&#xff0c;此函数就会调用 HAL_UART_MspInit&#xff0…...

基于Spring Integration的ESB与Kettle结合实现实时数据处理技术

一、方案概述 在当今数字化时代,企业面临着海量数据的实时处理与传输挑战。ESB(企业服务总线)作为系统集成的核心组件,承担着不同协议数据的接入与转换任务,而Kettle作为一款功能强大的ETL(Extract, Transform, Load)工具,在数据抽取、转换与加载方面表现出色。将ESB与…...

qt QOpenGLContext详解

1. 概述 QOpenGLContext 是 Qt 提供的一个类&#xff0c;用于管理 OpenGL 上下文。它封装了 OpenGL 上下文的创建、配置和管理功能&#xff0c;使得开发者可以在 Qt 应用程序中以平台无关的方式使用 OpenGL。通过 QOpenGLContext&#xff0c;可以轻松地创建和管理 OpenGL 上下…...

探索顶级汽车软件解决方案:驱动行业变革的关键力量

在本文中&#xff0c;将一同探索当今塑造汽车行业的最具影响力的软件解决方案。从设计到制造&#xff0c;软件正彻底改变车辆的制造与维护方式。让我们深入了解这个充满活力领域中的关键技术。 设计软件&#xff1a;创新车型的孕育摇篮 车辆设计软件对于创造创新型汽车模型至…...

Deepseek R1模型本地化部署+API接口调用详细教程:释放AI生产力

文章目录 前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装ollama2部署DeepSeek R1模型删除已存在模型&#xff0c;以7b模型为例 三、DeepSeek API接口调用Cline配置 前言 随着最近人工智能 DeepSeek 的爆火&#xff0c;越来越多的技术大佬们开始关注如…...

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) 设置输出视频帧数 示例&#xff1a; ffmpeg -i input.mp4 -vframes 90 output.mp4 表示输出90帧视频 2. -r[:stream_specifier] fps (input/output,per-stream) 设置帧率(rate) 示例&#xff1a; ffmpeg -i input.mp4…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库&#xff0c;用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合

在汽车智能化的汹涌浪潮中&#xff0c;车辆不再仅仅是传统的交通工具&#xff0c;而是逐步演变为高度智能的移动终端。这一转变的核心支撑&#xff0c;来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒&#xff08;T-Box&#xff09;方案&#xff1a;NXP S32K146 与…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...

LLMs 系列实操科普(1)

写在前面&#xff1a; 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容&#xff0c;原视频时长 ~130 分钟&#xff0c;以实操演示主流的一些 LLMs 的使用&#xff0c;由于涉及到实操&#xff0c;实际上并不适合以文字整理&#xff0c;但还是决定尽量整理一份笔…...

三分算法与DeepSeek辅助证明是单峰函数

前置 单峰函数有唯一的最大值&#xff0c;最大值左侧的数值严格单调递增&#xff0c;最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值&#xff0c;最小值左侧的数值严格单调递减&#xff0c;最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档&#xff1a;manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号&#xff1a;4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...

django blank 与 null的区别

1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是&#xff0c;要注意以下几点&#xff1a; Django的表单验证与null无关&#xff1a;null参数控制的是数据库层面字段是否可以为NULL&#xff0c;而blank参数控制的是Django表单验证时字…...

抽象类和接口(全)

一、抽象类 1.概念&#xff1a;如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象&#xff0c;这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法&#xff0c;包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中&#xff0c;⼀个类如果被 abs…...