【相机基础知识与物体检测】更新中
参考: 黑马机器人 | 相机标定&物体检测
https://robot.czxy.com/docs/camera/
01-相机基础
相机基础概述¶
相机是机器视觉的基础,相机直接产生了相机数据。所有视觉算法都是作用在相机数据上的。相机数据的好坏,或者对相机数据的理解方式,直接决定了视觉算法的效果。
世界中的光线被检测到,于是产生了视觉。光线从某种发射源(如灯管、太阳)发射出射线,穿过空间照射到某个物体上。此时,大部分光线被吸收,我们认为没有被吸收的光线就是物体的颜色,这些光线反射进入我们的眼睛(或相机),被我们的视网膜(或图像采集器)吸收。
光线从物体发射开始,通过透镜到达眼睛或相机,然后到达视网膜或图像采集器的几何过程,是计算机视觉应用实现的重要部分。
可以说:机器视觉是建立在对相机成像过程的深刻理解的基础之上的。
相机分类¶
依据相机数据维度的不同,相机分为两类,
- 2D相机,可以产生图像数据,包括灰度图,彩色图等
- 3D相机,可以产生图形数据,包括深度图,点云图等
2D相机¶
- CCD相机
- CMOS相机
3D相机¶
根据相机的工作原理可以分为以下几种:
- TOF相机
- 双目相机
- 结构光相机
- 激光扫描仪
传感器¶
通过透镜聚焦于像平面的光线,最终需要通过传感器来生成图像。目前,有两种最流行的数字传感器技术,
- CCD, charge-coupled device 电荷耦合器件
- CMOS, complementary metal-oxide semiconductor 互补金属氧化物半导体
两者的主要区别是从芯片中读出数据的方式即读出结构不同。下图描述了两者读出方式的不同。
1. CCD传感器¶
CCD传感器由一系列光线敏感的光电传感器组成,光电探测器能将光子转为电子并将电子转为电流。 曝光时,光电探测器累计电荷,通过转移门电路,电荷被移至串行读出寄存器从而读出。 每个光电探测器对应一个读出寄存器。 下图形象的描述了CCD传感器的工作原理。
2. CMOS传感器¶
CMOS传感器通常采用光电二极管作为光电探测器。 与CCD传感器不同,光电二极管中的电荷不是顺序地转移到读出寄存器,CMOS传感器的每一行都可以通过行和列选择电路直接选择并读出。因此,CMOS传感器可以当做随机读取存储器。
3. 彩色相机¶
CCD和CMOS传感器,对于整个可见光波段全部有响应,所以无法产生彩色图像。 为了产生彩色图像,需要在传感器前面加上彩色滤镜阵列(color filter array, CFA)使得一定范围的光到达每个光电探测器。 下图展示了最常见的Bayer滤镜阵列。这种滤镜阵列由三种滤镜组成,每种滤镜都可以透过人眼敏感的三基色红,绿,蓝中的一种。由于人眼对绿色最为敏感,所以滤镜阵列中绿色采样频率是其它两种的两倍。值得注意的是由于绿色采样是1/2,红、蓝是1/4,这就导致了严重的图像失真。通常在传感器前加上控图像失真滤光片。 CCD彩色相机的示意图:
输出信号时,像素的RGB分量是由其对应像元和其附近的像元共同构成的。
Bayer滤波法:
02-3D相机及分类¶
1. TOF相机¶
TOF(Time of flight)直译为飞行时间。所谓飞行时间法3D成像,是通过给目标连续发送光脉冲,然后用传感器接收从物体返回的光,通过探测光脉冲的飞行(往返)时间来得到目标物距离。
TOF相机与普通机器视觉成像过程也有类似之处,都是由光源、光学部件、传感器、控制电路以及处理电路等几部单元组成。TOF相机不仅可以获取到深度信息还可以获取到图像的灰度信息,微软kinect2即是基于TOF原理的深度相机。
TOF 相机目前的主要应用领域包括:物流行业,安防和监控,工业视觉,工业定位、工业引导和体积预估;替代工位上占用大量空间的、基于红外光进行安全生产控制的设备,医疗和生物,互动娱乐等领域。
2. 双目RGB相机¶
双相机立体视觉指仅依靠双相机的视差获取深度信息的方式。
双相机立体视觉相机因为非常依赖纯图像特征匹配,所以在光照较暗或者过度曝光的情况下效果都非常差,另外如果被测场景本身缺乏纹理,也很难进行特征提取和匹配。例如纯色的背景。
3. 结构光相机¶
结构光(Structured Light)相机是通过红外((Infrared Radiation)发射端投射人眼不可见的伪随机散斑红外光点到物体上,每个伪随机散斑光点和它周围窗口内的点集在空间分布中的每个位置都是唯一且已知的。这是结构光的存储器中已经预储存了所有的数据。这些散斑投影在被观察物体上的大小和形状根据物体和相机的距离和方向而不同。拍摄到的斑点和已知斑点进行对比,然后获取到深度信息。
根据三种不同的距离使用了三种不同尺寸的散斑,这样的目的是为了在远中近三种距离内都能得到相对较好的测量精度:
近距离(0.8 – 1.2 m):可以获得较高的测量精度, 中距离(1.2 – 2.0 m):可以获得中等的测量精度, 远距离(2.0– 3.5 m):可以获得较低的测量精度。
4. 三维扫描仪¶
三维扫描仪(3D scanner)主要有两种:拍照式扫描仪,激光扫描仪。
三维扫描仪的作用是用来创建物体表面的点云图,从而生成物体的表面形状,越密集的点云,构建出的三维形状越精确。
- 拍照式扫描仪
拍照式三维扫描仪是一种高速高精度的三维扫描测量设备,应用的是目前国际上最先进的结构光非接触照相测量原理。拍照式三维扫描仪采用了结构光技术、相位测量技术、计算机视觉技术,是一种复合三维非接触式测量技术。
它采用的是白光光栅扫描,以非接触三维扫描方式工作,全自动拼接,具有高效率、高精度、高寿命、高解析度等优点,特别适用于复杂自由曲面逆向建模, 主要应用于产品研发设计(RD,比如快速成型、三维数字化、三维设计、三维立体扫描等)、逆向工程(RE,如逆向扫描、逆向设计)及三维检测。
- 激光扫描仪
激光式扫描仪工作时,将激光线照射在物体上,通过两个相机捕捉每个瞬间的三维扫描数据,根据捕获到的不同角度的激光反射及折射,通过软件构建三维图像,由于激光扫描的频率很高,较快的扫描动作也能得到较准确的结果。使用时常需要使用反光型焦点标志贴,与扫描软件配合使用,以进行摄影测量和自动校准。
激光扫描仪是在原有拍照式扫描仪的基础上设计的,比拍照式拥有更高的精准度,可以满足更加苛刻的三维逆向建模需求。
03-相机模型¶
在图像测量过程以及机器视觉应用中,为确定空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系,必须建立相机成像的几何模型,这些几何模型参数就是相机参数。
标定的目标:求出相机的内、外参数,以及畸变参数。
为什么需要标定:
无论是在图像测量或者机器视觉应用中,相机参数的标定都是非常关键的环节,其标定结果的精度及算法的稳定性直接影响相机工作产生结果的准确性。因此,做好相机标定,提高标定精度是做好后续工作的前提和重点。
小孔成像模型¶
(图1) 小孔成像原理示意图
上图是最原汁原味的小孔成像原理图,它描述的是三维空间中的点到图像平面(image plane)上的投影。
思考: 三维空间中的每个点,都在图像平面上有一个唯一对应的投影吗?
在实际的实现和应用中,为了表达的方便,通常会将图像平面放在小孔和三维场景之间。如下图所示,(这是大家在很多教科书,播客,专业书籍上能看到的图)
(图2) 小孔成像原理的一个实际实现的描述
(图3) 对图2的一些直观补充
这里介绍几个概念:
- 光轴:像极坐标系的Z轴
- 光心:光轴中心点,即上图中的O点
- 主点:光轴与图像平面的交点Principal Point
- 焦距:光心到图像平面的距离Focal Length
四个坐标系¶
为了数学表达的方便,通常以光心为原点,建立一个图像坐标系。下图详细的描述了这些关系。
点在各个坐标系的表达:
04-坐标变换¶
下面详细推导下3个坐标系之间的对应关系:
1. 世界->相机¶
2. 相机->图像¶
3. 图像->像素¶
根据在图像中点pp的坐标xyxy,得到其在像素坐标系即我们所能看到的图片像素中的位置uvuv
综合: 世界->像素¶
:::tip
由于制造工艺等因素,相机像素坐标系中心未必与光轴经过的图像坐标系中心重合,即(u0,v0)(u0,v0)并非是像素坐标系的中心,而是在中心附近某个位置,焦距及像素物理尺寸也非绝对精准,故而需要通过实际的内参标定过程,确定相机的内参矩阵。
05-相机透镜及畸变¶
透镜¶
实际成像时,如果小孔过小,则入射光的强度会受到影响,进一步会影响到成像。 另一方面,由于光的波动性,在小孔的边缘上,光将发生衍射,因此,这些光将在像平面上“散播”。当小孔变的越来越小时,入射光的“散播”范围将变得越来越大,因此,入射光中越来越多的能量将会被“散播”到:偏离入射光方向的“地方”。
我们在使用针孔相机时,我们做过一个假设:针孔是无线小的一个孔。在真实物理世界中,我们的假设一般无法成立,那如果改变针孔的大小后,会发生怎样的变化呢?
如上图所示,当针孔尺寸发生改变后,穿过针孔的光线数量就会增加。光线数越多,像平面中的点就会被三维世界中物体上越多的点影响,导致图像越发模糊。针孔小了,得到的图像更清晰,但也更暗。自然而然的,我们就会想到针孔模型下的一个基本问题:我们能设计一个相机能得到既清晰又明亮的图像吗?
为了解决小孔相机的上述问题,我们现在考虑:在成像系统中使用透镜。镜头可以使光线聚焦或分散,如果我们选用一个理想的透镜替代针孔,那他应该具有以下特性:P点发出的所有射线,经镜头折射后,聚焦在像平面上P′点。
假如我们另取一点 Q ,在像平面上的投影点则可能是模糊或失焦的。每个镜头都会有特定的准确对焦的距离,在摄影学或计算机图形学中也叫景深(depth of field)。
镜头能够讲所有平行于光轴的光线折射到同一个点,称之为焦点。焦点和光心的距离即为焦距ff。从光心穿过的光线不会偏离原始方向。
一个理想的透镜具有如下两个性质:
- 它的投影方式和小孔模型相同
- 将一定数量的光线汇聚在一起。
畸变参数¶
径向畸变¶
径向畸变来自透镜形状不规则以及建模的方式,导致镜头不同部分焦距不同。光线在远离透镜中心的地方偏折更大(枕型畸变)或更小(桶形畸变)。
从径向畸变开始。实际摄像机的透镜总是在成像仪的边缘产生显著的畸变,如下图所示。对某些透镜,光线在远离透镜中心的地方比靠近中心的地方更加弯曲。
对径向畸变,成像仪中心(光轴)的畸变为0,随着向边缘移动,畸变越来越严重。当然,在实际的相机中,这种畸变比较小,而且可以用r=0位置周围的泰勒级数展开的前几项来定量描述。
下图显示矩形网格因径向畸变而产生的位移。越远离光轴中心的地方,矩形网格上的点偏移越大。
下图描述了3种常见的畸变情形,桶形畸变通常k1>0,枕形畸变通常k1<0。
切向畸变¶
切向畸变来自于整个摄像机的组装过程。由于透镜制造上的缺陷使得透镜本身与图像平面不平行而产生的,如下图所示:
切向畸变可以用两个额外的参数p1p1和p2p2来描述:
06-相机标定与去畸变¶
综合径向畸变和切向畸变,我们总结出去畸变公式:
相关文章:

【相机基础知识与物体检测】更新中
参考: 黑马机器人 | 相机标定&物体检测https://robot.czxy.com/docs/camera/ 01-相机基础 相机基础概述 相机是机器视觉的基础,相机直接产生了相机数据。所有视觉算法都是作用在相机数据上的。相机数据的好坏,或者对相机数据的理解方式…...

【前端】性能优化和分类
本页知识点参考:https://zhuanlan.zhihu.com/p/514222781 1. 加载性能优化 1.1 网站性能优化 content方法: 1)减少HTTP请求:合并文件,CSS精灵,inline Image 2)减少DNS查询:DNS缓存&…...

PPO和GRPO算法
verl 是现在非常火的 rl 框架,而且已经支持了多个 rl 算法(ppo、grpo 等等)。 过去对 rl 的理解很粗浅(只知道有好多个角色,有的更新权重,有的不更新),也曾硬着头皮看了一些论文和知…...
ceph 对象存储用户限额满导致无法上传文件
查看日志 kl logs -f rook-ceph-rgw-my-store-a-5cc4c4d5b5-26n6j|grep -i error|head -1Defaulted container "rgw" out of: rgw, log-collector, chown-container-data-dir (init) debug 2025-05-30T19:44:11.573+0000 7fa7b7a6d700...

rk3588 上运行smolvlm-realtime-webcam,将视频转为文字描述
smolvlm-realtime-webcam 是一个开源项目,结合了轻量级多模态模型 SmolVLM 和本地推理引擎 llama.cpp,能够在本地实时处理摄像头视频流,生成自然语言描述, 开源项目地址 https://github.com/ngxson/smolvlm-realtime-webcamhttps…...
某航参数逆向及设备指纹分析
文章目录 1. 写在前面2. 接口分析3. 加密分析4. 算法还原5. 设备指纹风控分析与绕过【🏠作者主页】:吴秋霖 【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Python与爬虫领域研究…...
SQL思路解析:窗口滑动的应用
目录 🎯 问题目标 第一步:从数据中我们能直接得到什么? 第二步:我们想要的“7天窗口”长什么样? 第三步:SQL 怎么表达“某一天的前六天”? 🔍JOIN 比窗口函数更灵活 第四步&am…...

Rust 学习笔记:Box<T>
Rust 学习笔记:Box Rust 学习笔记:Box<T\>Box\<T> 简介使用 Box\<T\> 在堆上存储数据启用带有 box 的递归类型关于 cons 列表的介绍计算非递归类型的大小使用 Box\<T\> 获取大小已知的递归类型 Rust 学习笔记:Box<…...
C# 从 ConcurrentDictionary 中取出并移除第一个元素
C# 从 ConcurrentDictionary 中取出并移除第一个元素 要从 ConcurrentDictionary<byte, int> 中取出并移除第一个元素,需要结合 遍历 和 原子移除操作。由于 ConcurrentDictionary 是无序集合,"第一个元素" 通常是指最早添加的元素&…...

操作系统学习(十三)——Linux
一、Linux Linux 是一种类 Unix 的自由开源操作系统内核,由芬兰人 Linus Torvalds 于 1991 年首次发布。如今它广泛应用于服务器、桌面、嵌入式设备、移动设备(如 Android)等领域。 设计思想: 原则描述模块化与可移植性Linux 内…...

NLP学习路线图(二十二): 循环神经网络(RNN)
在自然语言处理(NLP)的广阔天地中,序列数据是绝对的核心——无论是流淌的文本、连续的语音还是跳跃的时间序列,都蕴含着前后紧密关联的信息。传统神经网络如同面对一幅打散的拼图,无法理解词语间的顺序关系,…...

每日一C(1)C语言的内存分布
目录 代码区 常量区 全局/静态区 初始化数据段(.data) 未初始化数据段(.bss) 堆区 栈区 总结 今天我们学习的是C语言的内存分布,以及这些分区所存储的内容和其特点。今天的思维导图如下。 C语言作为一款直接处…...

Photoshop使用钢笔绘制图形
1、绘制脸部路径 选择钢笔工具,再选择“路径”。 基于两个点绘制一个弯曲的曲线 使用Alt键移动单个点,该点决定了后续的曲线方向 继续绘制第3个点 最后一个点首尾是同一个点,使用钢笔保证是闭合回路。 以同样的方式绘制2个眼睛外框。 使用椭…...

应用层协议:HTTP
目录 HTTP:超文本传输协议 1.1 HTTP报文 1.1.1 请求报文 1.1.2 响应报文 1.2 HTTP请求过程和原理 1.2.1 请求过程 1、域名(DNS)解析 2、建立TCP连接(三次握手) 3、发送HTTP请求 4、服务器处理请求 5、返回H…...

复习——C++
1、scanf和scanf_s区别 2、取地址,输出 char ba; char* p&b; cout<<*p; cout<<p; p(char*)"abc"; cout<<*p; cout<<p; cout<<(void*)p; 取地址,把b的地址给p 输出*p,是输出p的空间内的值…...

SPI通信协议(软件SPI读取W25Q64)
SPI通信协议 文章目录 SPI通信协议1.SPI通信2.SPI硬件和软件规定2.1SPI硬件电路2.2移位示意图2.3SPI基本时序单元2.3.1起始和终止条件2.3.2交换一个字节(模式1) 2.4SPI波形分析(辅助理解)2.4.1发送指令2.4.2指定地址写2.4.3指定地…...
PostgreSQL-基于PgSQL17和11版本导出所有的超表建表语句
最新版本更新 https://code.jiangjiesheng.cn/article/368?fromcsdn 推荐 《高并发 & 微服务 & 性能调优实战案例100讲 源码下载》 1. 基于pgsql 17.4 研究 查询psql版本:SELECT version(); 查看已知1条建表语句和db中数据关系 SELECT create_hypert…...

JavaWeb:前后端分离开发-部门管理
今日内容 前后端分离开发 准备工作 页面布局 整体布局-头部布局 Container 布局容器 左侧布局 资料\04. 基础文件\layout/index.vue <script setup lang"ts"></script><template><div class"common-layout"><el-containe…...
ArcGIS计算多个栅格数据的平均栅格
3种方法计算多个栅格数据的平均栅格 1->使用“ 栅格计算器”工具 原理就是把多幅影像数据相加,然后除以个数,就能得到平均栅格。 2-> 使用“像元统计数据”工具,如果是ArcGIS pro,则是“像元统计”工具。使用这个工具可以…...

字节开源FlowGram:AI时代可视化工作流新利器
字节终于开源“扣子”同款引擎了!FlowGram:AI 时代的可视化工作流利器 字节FlowGram创新性地融合图神经网络与多模态交互技术,构建了支持动态拓扑重构的可视化流程引擎。该系统通过引入 f ( G ) ( V ′ , E ′ ) f(\mathcal{G})…...
如何选择合适的分库分表策略
选择合适的分库分表策略需要综合考虑业务特点、数据规模、访问模式、技术成本等多方面因素。以下是系统性的选择思路和关键决策点: 一、核心决策因素 业务需求分析 数据规模:当前数据量(如亿级)、增长速度(如每日新增百…...

(LeetCode 每日一题)3403. 从盒子中找出字典序最大的字符串 I (贪心+枚举)
题目:3403. 从盒子中找出字典序最大的字符串 I 题目:贪心枚举字符串,时间复杂度0(n)。 最优解的长度一定是在[1,n-numFriends]之间。 字符串在前缀都相同的情况下,长度越长越大。 C版本: class Solution { public:st…...

GPIO的内部结构与功能解析
一、GPIO总体结构 总体构成 1.APB2(外设总线) APB2总线是微控制器内部连接CPU与外设(如GPIO)的总线,负责CPU对GPIO寄存器的读写访问,支持低速外设通信 2.寄存器 控制GPIO的配置(输入/输出模式、上拉/下拉等&#x…...
Python训练打卡Day42
Grad-CAM与Hook函数 知识点回顾 回调函数lambda函数hook函数的模块钩子和张量钩子Grad-CAM的示例 在深度学习中,我们经常需要查看或修改模型中间层的输出或梯度。然而,标准的前向传播和反向传播过程通常是一个黑盒,我们很难直接访问中间层的信…...
深度学习中的负采样
深度学习中的负采样 负采样(Negative Sampling) 是一种在训练大型分类或概率模型(尤其是在输出类别很多时)中,用来加速训练、降低计算量的方法。 它常用于: 词向量训练(如 Word2Vecÿ…...

php7+mysql5.6单用户中医处方管理系统V1.0
php7mysql5.6中医处方管理系统说明文档 一、系统简介 ----------- 本系统是一款专为中医诊所设计的处方管理系统,基于PHPMySQL开发,不依赖第三方框架,采用原生HTML5CSS3AJAX技术,适配手机和电脑访问。 系统支持药品管理、处方开…...
Java 大视界 — Java 大数据在智能安防视频监控中的异常事件快速响应与处理机制
/*Java 大数据在智能安防视频监控中的异常事件快速响应与处理机制(简化示例)*/// 1. Event.java - 异常事件模型 package com.security.model;public class Event {private String id;private String type; // 如: "入侵", "火警"pr…...

智慧物流园区整体解决方案
该智慧物流园区整体解决方案借助云计算、物联网、ICT 等技术,从咨询规划阶段介入,整合供应链上下游资源,实现物流自动化、信息化与智能化。方案涵盖智慧仓储管理(如自动化立体仓储系统、温湿度监控)、智慧物流(运输管理系统 TMS、GPS 监控)、智慧车辆管理(定位、调度、…...
审批流程管理系统开发记录:layui前端交互的实践
一、需求拆解与技术选型 本次开发围绕企业审批流程管理场景,需实现以下核心功能: 前端申请表单与流程进度可视化底部滑动审批弹窗交互多版本MySQL数据库支持流程数据的增删改查与状态管理技术栈选择: 前端采用LayUI框架,利用其时间线组件(lay-timeline)实现流程进度展示…...

【会员专享数据】1960—2023年我国省市县三级逐年降水量数据(Shp/Excel格式)
之前我们分享过1960-2023年我国0.1分辨率的逐日、逐月、逐年降水栅格数据(可查看之前的文章获悉详情),是研究者Jinlong Hu与Chiyuan Miao分享在Zenodo平台上的数据,很多小伙伴拿到数据后反馈栅格数据不太方便使用,问我…...