单目视觉测量及双目视觉测量
一、单目视觉测量
1.1 原理部分讲解
单目视觉系统通过采集图像,将图像转换为二维数据,然后对采集的图像进行模式识别,通过图像匹配算法识别行驶过程中的车辆、行人、交通标志等,最后依据目标物体的运动模式和定位技术,估算目标物体与本车的相对距离和相对速度。
单目相机测距常用或者说实用的方法就是相似三角形法。这种方法假设我们有一个宽度为W的目标或者物体,然后我们将这个目标放在距离我们的相机为D的位置。我们用相机对物体进行拍照并且测量物体的像素宽度P。这样我们就得出了相机焦距的公式:F = (P x D) / W。通过这个公式,我们可以计算出物体离相机的距离。
该算法具有结构简单、运算速度快、成本低等优点。它不需要像双目视觉那样进行复杂的特征点匹配,因此算法的实时性和鲁棒性较好。但一个主要挑战是缺乏深度信息,导致尺度模糊问题。此外,单目视觉系统在复杂环境下的距离估计、低光照条件下的性能表现等方面也面临挑战。
1.2 常用特征测量算法
1.2.1 SIFT(尺度不变特征变换)
SIFT(Scale-Invariant Feature Transform,尺度不变特征变换)是一种在计算机视觉领域广泛使用的特征检测和描述算法,由David G. Lowe在1999年提出,并在2004年完善。SIFT算法的核心思想是提取图像中的局部特征,并生成对应的特征描述子,这些特征对图像的旋转、尺度缩放、亮度变化保持不变性,对视角变化、仿射变换、噪声也保持一定程度的稳定性。
其主要包括以下特点:
- 尺度不变性:SIFT特征对图像的缩放保持不变,这意味着在同一物体的不同尺度图像中,SIFT能够检测到相同的特征点。
- 旋转不变性:SIFT特征对图像的旋转保持不变,即旋转图像后,SIFT能够检测到相同的特征点。
- 亮度不变性:SIFT特征对图像的亮度变化不敏感,即使在不同光照条件下,也能检测到相同的特征点。
同时SIFT对视角变化、仿射变换、噪声等具有一定的稳定性,具有较好的区分性,信息量丰富,适用于在海量特征数据库中进行快速、准确的匹配。即使在图像中只有少数几个物体,SIFT也能产生大量的特征向量,并且SIFT可以与其他形式的特征向量方便地联合使用。
SIFT算法的实现步骤主要包括:
- 尺度空间极值检测:在不同尺度下,通过高斯滤波器构建图像的高斯金字塔,并在每个尺度上寻找局部极值点,作为关键点候选。
- 关键点定位:通过在尺度空间和图像空间中对极值点进行精确定位,找到稳定的关键点。
- 方向赋值:为每个关键点分配一个或多个方向,提高特征的旋转不变性。
- 特征描述:基于关键点的位置和方向,计算局部特征向量,构建特征描述符
1.2.2 SURF(加速稳健特征)
SURF(Speeded Up Robust Features,加速稳健特征)算法是一种用于图像特征提取和描述的计算机视觉算法,由Herbert Bay等人在2006年提出。它是基于SIFT(Scale-Invariant Feature Transform)算法的改进版本,旨在提高特征检测和描述的速度,同时保持特征的尺度不变性和旋转不变性。
其主要包括以下特点:
- 快速性:SURF算法通过使用积分图像和快速的盒式滤波器(Box Filter)来加速特征点检测和描述符生成,比SIFT算法快几倍。
- 稳健性:SURF算法对于旋转、缩放、亮度变化等干扰具有较好的鲁棒性,能够在不同的场景中保持稳定的性能。
- 特征点检测:SURF使用Hessian矩阵的行列式值作为特征点检测的依据,这种方法可以有效地识别图像中的角点、边缘等特征点。
SURF算法在特征点周围选择一个区域,并计算该区域内的水平和垂直Haar小波响应,形成特征描述符。默认情况下,SURF描述符为64维,但也可以配置为128维以提高描述的精度。同时SURF算法可以为特征点分配一个主方向,以提高特征的旋转不变性。这一步骤可以通过统计特征点邻域内的Haar小波特征来实现。
值得一提的是,与SIFT不同,SURF的专利已经过期,因此在商业应用中更加自由无碍,其在图像匹配、目标识别、全景拼接等领域有着广泛的应用。
二、双目视觉测量
2.1 原理部分讲解
双目视觉测量算法是一种基于双目立体视觉原理的计算机视觉技术,它通过使用两个摄像头从不同角度捕捉同一场景的图像,来计算图像中每个像素点的视差信息,进而获取实际空间中物体的三维信息。通过双目视觉测量算法,甚至可以构建出三维空间中的点云,这些点云数据可以用于进一步的三维重建和分析。以下是双目视觉测量算法的关键步骤和原理:
- 双目标定:确定两个摄像头的内外参数。
- 立体校正(含消除畸变):对图像进行校正,使两个摄像头的图像位于同一平面且互相平行。
- 立体匹配:在两个校正后的图像中进行像素点匹配。
- 视差计算:根据匹配结果计算每个像素的视差。
- 深度计算(3D坐标):利用视差信息计算空间中物体的三维坐标
这种双目视觉测量算法的精度受到多种因素的影响,包括相机畸变、视差偏差、基线距离与焦距、像素大小和物理尺寸、深度范围等。其中相机畸变是指由于镜头光学特性导致的图像失真,需要通过标定来校正这些畸变,以获得准确的几何关系。而立体校正作为是双目视觉中的一个重要步骤,它包括消除畸变和调整图像,使得两个摄像头的图像可以进行有效的匹配。
立体匹配是双目视觉系统中的核心部分,它确定多幅图像之间投影点间的一一对应关系。有效的立体匹配可以使关键点更加容易被提取。视差图是立体匹配的结果,显示了场景中每个像素点的视差值。深度图是基于视差图计算得到的,它表示了场景中每个像素点到摄像头的距离。深度图的计算通常涉及到将视差值转换为实际的距离,这需要知道摄像头的焦距和摄像头之间的基线距离。
2.2 常用特征测量算法
在双目视觉测量中,特征测量算法是用于从图像中提取关键信息并进行匹配的重要技术。以下是一些常用的特征测量算法:
SIFT(Scale-Invariant Feature Transform,尺度不变特征变换):
SIFT算法能够在不同尺度和旋转下提取稳定的特征点,并且对亮度变化和视角变化保持不变性。SIFT特征提取的实质是在不同的尺度空间上查找关键点,并计算关键点的方向。这些关键点通常是图像中的角点、边缘点、暗区的亮点及亮区的暗点等。
SURF(Speeded Up Robust Features,加速稳健特征):
SURF算法是SIFT算法的改进版本,它采用快速Hessian算法检测关键点,并使用特征向量描述关键点周围区域的情况。SURF算法比SIFT算法快好几倍,同时保持了特征的尺度不变性和旋转不变性。
ORB(Oriented FAST and Rotated BRIEF):
ORB算法结合了FAST关键点检测和BRIEF描述子,具有旋转不变性和尺度不变性。ORB特征由关键点和描述子两部分组成,其中关键点是Oriented FAST,描述子是BRIEF。ORB对BRIEF进行了改进,使用了先前计算的方向信息。
Harris角点检测:
Harris角点检测是一种经典的角点检测方法,它通过计算图像的梯度和其二阶矩来检测角点。Harris角点检测基本思想是识别图像中灰度变化明显的地方,这些地方通常是角点。
BRIEF(Binary Robust Independent Elementary Features):
BRIEF是一种快速的特征描述子提取方法,它通过对关键点周围的小块区域进行随机采样,并比较这些区域的像素值来生成二进制字符串作为描述子。
FREAK(Fast Retina Keypoint):
FREAK是一种快速的特征点提取和匹配算法,它模拟人类视网膜对视觉信息的处理方式,具有旋转不变性和尺度不变性。
AKAZE(Accelerated-KAZE):
AKAZE是一种非线性特征提取算法,它结合了KAZE算法的优点,并对其进行了加速。AKAZE能够提取出对视角变化和光照变化具有不变性的特征点。
相关文章:
单目视觉测量及双目视觉测量
一、单目视觉测量 1.1 原理部分讲解 单目视觉系统通过采集图像,将图像转换为二维数据,然后对采集的图像进行模式识别,通过图像匹配算法识别行驶过程中的车辆、行人、交通标志等,最后依据目标物体的运动模式和定位…...

python学习打卡day34
DAY 34 GPU训练及类的call方法 知识点回归: CPU性能的查看:看架构代际、核心数、线程数GPU性能的查看:看显存、看级别、看架构代际GPU训练的方法:数据和模型移动到GPU device上类的call方法:为什么定义前向传播时可以直…...
掩码与网关是什么?
1. 子网掩码(Subnet Mask) 作用:划分“小区”范围 想象你住在一个小区(子网)里: 小区门牌号 IP地址(如 192.168.1.10) 小区边界 子网掩码(如 255.255.255.0…...

leetcode-快慢指针系列
开胃小菜 141. 环形链表 给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链…...

JAVA05基本数据类型和包装类的转换,转换成其他数据类型,包装类与字符串的转换+学生类的定义实例
1.基本数据类型和包装类的转换 下面是一个自动手动的例题 2.将包装类转换成其他类型 3. 将数据类型转换成字符串 将字符串转换成数据类型 以下是一个例题 学生类的例题...

Python打卡训练营学习记录Day34
知识点回归: CPU性能的查看:看架构代际、核心数、线程数 GPU性能的查看:看显存、看级别、看架构代际 GPU训练的方法:数据和模型移动到GPU device上 类的call方法:为什么定义前向传播时可以直接写作self.fc1(x) CPU性…...

动手学习深度学习V1.1 chapter2 (2.1-2.2)
chapter2:深度学习基础 区分问题:回归问题还是分类问题? 输出结果是不明确的连续值的时候就是回归问题,比如房价预测,销售额预测等。 输出结果是明确几个离散值的时候就是分类问题,比如字符识别…...

数据结构(6)线性表-队列
一、队列的概述 队列也是一种特殊的线性表,只允许在一段插入数据,另一端删除数据。插入操作的一端称为队尾,删除操作的一端称为队头。 如图: 二、队列相关操作 1.队列结构体的声明 类似于栈,他肯定也得借助于数组或…...
NumPy 2.x 完全指南【十七】转置操作
文章目录 1. 什么是转置2. 转置操作2.1 transpose2.2 ndarray.T2.3 moveaxis2.4 rollaxis2.5 permute_dims2.6 swapaxes2.7 matrix_transpose 1. 什么是转置 在线性代数中,矩阵转置是指将矩阵的行和列进行互换,即原矩阵的第 i i i 行、第 j j j 列元素…...

【数据架构04】数据湖架构篇
✅ 10张高质量数据治理架构图 无论你是数据架构师、治理专家,还是数字化转型负责人,这份资料库都能为你提供体系化参考,高效解决“架构设计难、流程不清、平台搭建慢”的痛点! 🌟限时推荐,速速收藏&#…...
使用OpenSSL生成根证书并自签署证书
生成根CA的私钥和证书 # 生成根 CA 的私钥 [rootdeveloper ssl]# openssl genrsa -out rootCA.key 2048 Generating RSA private key, 2048 bit long modulus (2 primes) ... ............................................................ e is 65537 (0x010001)# 使用私钥生…...

uniapp-商城-62-后台 商品列表(分类展示商品的布局)
每一个商品都有类别,比如水果,蔬菜,肉,粮油等等,另外每一个商品都有自己的属性,这些都在前面的章节进行了大量篇幅的介绍。这里我们终于完成了商品类的添加,商品的添加,现在到了该进…...

初识C++:模版
本篇博客主要讲解C模版的相关内容。 目录 1.泛型编程 2.函数模板 2.1 函数模版概念 2.2 函数模版格式 2.3 函数模版的原理 2.4 函数模版的实例化 1.隐式实例化:让编译器根据实参推演模板参数的实际类型 2. 显式实例化:在函数名后的<>中指定模…...
【Elasticsearch】给所索引创建多个别名
Elasticsearch 是可以给索引创建多个别名的。 为什么可以创建多个别名 1. 灵活性 - 别名可以为索引提供一个更易于理解的名称,方便用户根据不同的业务场景或用途来引用同一个索引。例如,一个索引可能同时服务于多个不同的应用程序或服务,通…...
Linux入门(九)任务调度
设置任务调度文件 /etc/crontab #设置调度任务 crontab -e #将任务设置到调度文件 # * * * * * # 第1个* 分钟 0-59 # 第2个* 小时 0-23 # 第3个* 天 1-31 # 第4个* 月 1-12 # 第5个* 周 0-7 0和7都代表的是星期天 #每分钟执行 */1 * * * * ls -l /etc/ > /tmp/to.txt0 8,…...

突破认知边界:神经符号AI的未来与元认知挑战
目录 一、神经符号AI的核心领域与研究方法 (一)知识表示:构建智能世界的语言 (二)学习与推理:让机器“思考”与“学习” (三)可解释性与可信度:让AI更透明 …...

Java 处理地理信息数据[DEM TIF文件数据获取高程]
目录 1、导入依赖包 2、读取方法 3、其他相关地理信息相关内容: 1️⃣常用的坐标系 1、GIS 中的坐标系一般分为两大类: 2. ✅常见的地理坐标系 2.0 CGCS2000(EPSG:4490) 2.1 WGS84 (World Geodetic System 1984) (EPSG…...

谈谈对dubbo的广播机制的理解
目录 1、介绍 1.1、广播调用 1、工作原理 1.2、调用方式 1、Reference 注解 2、XML 配置 3、全局配置 1.3、 广播机制的特性 2、重试机制 2.1、默认行为 2.2、自定义逻辑 1、在业务层封装重试逻辑 2、使用 Reference 3、广播调用的实践 3.1、常用参数 1.…...
对接钉钉消息样例:DING消息、机器人
一、钉钉开放平台配置信息 private static String robotCode private static String appkey private static String appsecret private static Long agentId 二、钉钉开放平台token、用户信息 public static Client createClient() throws Exception {Config config n…...

003-类和对象(二)
类和对象(二) 1. 类的6个默认成员函数 如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。 默认成员函数ÿ…...
使用Rancher在CentOS 环境上部署和管理多Kubernetes集群
引言 随着容器技术的迅猛发展,Kubernetes已成为容器编排领域的事实标准。然而,随着企业应用规模的扩大,多集群管理逐渐成为企业IT架构中的重要需求。 Rancher作为一个开源的企业级多集群Kubernetes管理平台,以其友好的用户界面和…...
Java常用数据结构底层实现原理及应用场景
一、线性结构 1. ArrayList 底层实现:动态数组(Object[] elementData)。 核心特性: 默认初始容量为 10,扩容时容量增长为原来的 1.5 倍(int newCapacity oldCapacity (oldCapacity >> 1)…...
利用朴素贝叶斯对UCI 的 mushroom 数据集进行分类
朴素贝叶斯(Naive Bayes)是一种基于贝叶斯定理的简单而有效的分类算法,特别适合处理文本分类和多类别分类问题。UCI的Mushroom数据集是一个经典的分类数据集,包含蘑菇的特征和类别(可食用或有毒)。 1. 数据…...

Linux火墙管理及优化
网络环境配置 使用3个新的虚拟机【配置好软件仓库和网络的】 F1 192.168.150.133 NAT F2 192.168.150.134 192.168.10.20 NAT HOST-ONLY 网络适配仅主机 F3 192.168.10.30 HOST-ONLY 网络适配仅主机 1 ~]# hostnamectl hostname double1.timinglee.org 【更…...

Visual Studio 制作msi文件环境搭建
一、插件安装 a. 插件寻找 在 Visual Studio 2017 中,如果你希望安装用于创建 MSI 安装包的插件,第一步是:打开 Visual Studio 后,点击顶部菜单栏中的 “工具”(Tools),然后选择下拉菜单中的 “…...
(Java基础笔记vlog)Java中常见的几种设计模式详解
前言: 在 Java 编程里,设计模式是被反复使用、多数人知晓、经过分类编目的代码设计经验总结。他能帮助开发者更高效地解决常见问题,提升代码的可维护性、可扩展性和复用性。下面介绍Java 中几种常见的设计模式。 单例模式(Singlet…...
C++ vector 深度解析:从原理到实战的全方位指南
一、引言 在 C 编程中,我们经常需要处理一组数据。比如,你想存储一个班级所有学生的成绩,或者保存用户输入的一组数字。最容易想到的方法是使用数组: int scores[100]; // 定义一个能存储100个成绩的数组但数组有两个明显的缺点…...

鸿蒙进阶——Framework之Want 隐式匹配机制概述
文章大纲 引言一、Want概述二、Want的类型1、显式Want2、隐式Want3、隐式Want的匹配 三、隐式启动Want 源码概述1、有且仅有一个Ability匹配2、有多个Ability 匹配需要弹出选择对话框3、ImplicitStartProcessor::ImplicitStartAbility3.1、GenerateAbilityRequestByAction3.1.1…...

antv/g6 图谱封装配置(二)
继上次实现图谱后,后续发现如果要继续加入不同样式的图谱实现起来太过麻烦,因此考虑将配置项全部提取封装到js文件中,图谱组件只专注于实现各种不同的组件,其中主要封装的点就是各个节点的横坐标(x),纵坐标…...

OpenCV CUDA模块图像过滤------用于创建一个最小值盒式滤波器(Minimum Box Filter)函数createBoxMinFilter()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 该函数创建的是一个 最小值滤波器(Minimum Filter),它对图像中每个像素邻域内的像素值取最小值。常用于&…...