相机标定(二)深入理解四大坐标系与其变换关系

一、前言

视觉系统一共有四个坐标系:像素平面坐标系(u,v)、图像坐标系(x,y)、相机坐标系(Xc,Yc,Zc)和世界坐标系(Xw,Yw,Zw),如下图所示。每种坐标系之间均存在联系,那么如何通过图像像素坐标定位到世界坐标系的坐标,需要通过相机标定来解决,其中关键的算法部分在于坐标系转换,而变换则需要通过齐次坐标的表示方式来完成。
在这里插入图片描述

二、坐标系变换

2.1像素坐标系和图像坐标系的变换

像素坐标就是像素在图像中的位置。像素坐标系是建立在图像中的,需要和相机坐标系进行变换,其单位为像素。其的左上角的顶点就是原点(Op),水平向右是u,垂直向下是v轴。
图像坐标系的单位为毫米,这是因为像素坐标没办法反应图片中点的具体尺寸大小,所以需要图像坐标系来表示,原点为Oi,为光轴与成像平面的交点。
两个坐标系都在成像平面上,只是各自的原点和度量单位不一样。转换时需要知道两个参数(dx,dy),分别表示感光芯片上像素的实际大小。
在这里插入图片描述
两者之间变换需要进行单位上的转换。在图中,假设图像中心的像素坐标是(u0,v0),那么,图像坐标系的坐标(x,y)与像素坐标系的坐标(u,v)之间的关系可以表示为:
u=x/dx+u0u=x/dx+u0u=x/dx+u0
v=y/dy+v0v=y/dy+v0v=y/dy+v0
转换为齐次坐标:
[uv1]\begin{bmatrix} u\\ v\\1\end{bmatrix}uv1=[1/dx0u001/dyv0001]\begin{bmatrix} 1/dx&0&u0\\ 0&1/dy&v0\\0&0&1\end{bmatrix}1/dx0001/dy0u0v01*[xy1]\begin{bmatrix} x\\ y\\1\end{bmatrix}xy1

2.2 相机坐标系与图像坐标系转换

相机坐标系是以相机的光轴作为Z轴,光线在相机光学系统的中心位置就是原点Oc(实际上就是透镜的中心),相机坐标系的水平轴Xc与垂直轴Yc分别于图像坐标系的X轴和Y轴平行,OcOi之间的距离为f。
在这里插入图片描述上图P点为图像点坐标,B为相机坐标系下物体坐标,可以通过相似三角形求解,如上图所示,最终也用齐次坐标进行表示。最后的表达式可以看出相机坐标系为三维,图像坐标系为2维,只能通过齐次坐标变换的形式升维。
那为什么像素坐标系会在相机坐标系的前面呢?
从原理图上我们可以看到像平面在镜面的右面,而在推导相机标定的坐标系关系时,却认为光线先通过成像平面,再在相机坐标系上汇聚到一个点。其原因是推导的时候,把像平面用虚拟像平面代替了。
在这里插入图片描述

2.3世界坐标系与相机坐标系转换

世界坐标系是目标物体位置的参考系,可以根据运算方便与否自由放置,单位为长度单位如mm。从世界坐标系转换到相机坐标系,涉及到旋转和平移(其实所有的运动也可以用旋转矩阵和平移向量来描述)。因为世界坐标系和摄像机坐标都是右手坐标系,所以其不会发生形变(刚性变换)。
在这里插入图片描述
计算过程:
平移,相机坐标点(Xc,Yc,Zc)平移距离为(tx,ty,tz)到世界坐标点(Xw,Yw,Zw):
[XwYwZw1]\begin{bmatrix} Xw\\ Yw\\Zw\\1\end{bmatrix}XwYwZw1=[100tx010ty001tz0001]\begin{bmatrix} 1&0&0&tx\\0&1&0&ty\\0&0&1&tz\\0&0&0&1\end{bmatrix}100001000010txtytz1*[XcYcZc1]\begin{bmatrix} Xc\\Yc\\Zc\\1\end{bmatrix}XcYcZc1
坐标点(Xc,Yc,Zc)在平移的过程中旋转一定角度到世界坐标点(Xw,Yw,Zw):
首先给定一个基本旋转矩阵和基本矩阵:
R=[cosθsinθ−sinθ−cosθ]\begin{bmatrix} cosθ&sinθ\\ -sinθ&-cosθ\end{bmatrix}[cosθsinθsinθcosθ]
基本矩阵:
[1000010000100001]\begin{bmatrix} 1&0&0&0\\0&1&0&0\\0&0&1&0\\0&0&0&1\end{bmatrix}1000010000100001
如果坐标点(Xc,Yc,Zc)绕X,Y,Z轴分别旋转α,β,γ度,则最终的表达式为(哈哈,实在不想自己推导仿射变换的公式了,直接给最终结果,链接可以看下方):
在这里插入图片描述
那么和平移变换联合起来可以写为:

在这里插入图片描述

2.4像素坐标系到世界坐标系变换(终极变换)

明天写。。。
红框内即为外参,R和T分别为旋转和平移量。
内参为是相机固有的属性,实际上就是焦距f,像元尺寸dx,dy。
Zc很明显,表示的是点离光轴的距离。

参考文章:
相机参数标定(camera calibration)及标定结果如何使用
3d变换基础:平移、旋转、缩放(仿射变换)详解——公式推导
计算机视觉:相机成像原理:世界坐标系、相机坐标系、图像坐标系、像素坐标系之间的转换

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/256363.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

相机标定(三) —— 畸变校正

一、前言 根据针孔模型,物体和成像之间参数会满足相似三角形的关系。但现实中会存在装配误差和透视失真等原因,导致这种关系无法成立,使理想成像与实际成像存在误差,这种误差即称为畸变。 畸变分为径向畸变,切向畸变和…

SVG技术入门:线条动画实现原理

相信大家都见到过这样神奇的技术:一副线条构成的画能自动画出自己。非常的酷。Jake Archibald是这种SVG技术的首创者,并且写了一篇非常好的文章来描述它是如何实现的。Brian Suda也在24 Ways网站上讨论过它。 Polygon使用它在一篇设计方面的文章里创造出…

机器学习——人工神经网络之BP算法编程(python二分类数据集:马疝病数据集)

目录 一、理论知识回顾 1、神经网络模型 2、明确任务以及参数 1)待估参数: 2)超参数: 3)任务 3、神经网络数学模型定义 1)激活函数 ​ 2)各层权重、阈值定义 3)各层输入输…

Halcon例程(基于多个标定图的单目相机标定)详解—— Camera_calibration_multi_image.hdev

一、前言 在我的工业相机专栏里已经将相机标定涉及到的理论部分讲解完毕,为什么要标定以及标定要求出什么参数呢,用一个Halcon 例程来帮助理解。 这个例程是比较经典的标定程序,基本将标定过程讲的比较清楚,用的标定图像是系统自…

SkipList 跳表

为什么选择跳表 目前经常使用的平衡数据结构有:B树,红黑树,AVL树,Splay Tree, Treep等。 想象一下,给你一张草稿纸,一只笔,一个编辑器,你能立即实现一颗红黑树,或者AVL树…

机器学习——深度学习之卷积神经网络(CNN)——LeNet卷积神经网络结构

目录 一、卷积神经网络 1、卷积神经的作用 2、LeNet 1)数据库准备——minst 2)模型 二、关于卷积神经网络结构的一些术语定义 1、特征图(Feature map) 2、height(长度)、width(宽度&…

工业相机(3D)主要参数详述

一、前言 准确的完成相机选型是一个视觉工程师必备的技能,而选型前必须对其内部参数了如指掌。工业相机是一种比较复杂的产品,其参数很多,每个参数可能会有不同的标准,下面对主要的参数会做比较详细的阐述。 二、参数详述 2.1 …

JAVA8永久代

在Java虚拟机(以下简称JVM)中,类包含其对应的元数据,比如类的层级信息,方法数据和方法信息(如字节码,栈和变量大小),运行时常量池,已确定的符号引用和虚方法表…

Struts 2初体验

Struts2简介: Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。 Struts 2 目录结构:     apps目录:Struts2示例…

机器学习——深度学习之数据库和自编码器

目录 一、数据库——数据获取 1、Mnist 2、ImageNet 二、自编码器(Auto-encoder)——参数初始化 1、功能 2、基本思想 1)训练第一层 2)训练第二层及以后的神经网络 ​ 3)利用BP对整个神经网络的参数初始值进…

Halcon例程详解 (深度图转换为3D图像)—— xyz_attrib_to_object_model_3d

一、前言 深度图向点云图进行转换是进行3D检测项目时会遇到的问题,halcon里也有针对此问题的相关例程,下面对此例程进行分析。通过学习此例程,我们可以掌握如何将一张深度图像和一张正常二维图像转换为3D点云。 二、分析 * 初始化界面 dev…

动态代理之Cglib浅析

什么是Cglib Cglib是一个强大的,高性能,高质量的代码生成类库。它可以在运行期扩展JAVA类与实现JAVA接口。其底层实现是通过ASM字节码处理框架来转换字节码并生成新的类。大部分功能实际上是ASM所提供的,Cglib只是封装了ASM,简化了…

机器学习——深度学习之卷积神经网络(CNN)——AlexNet卷积神经网络结构

目录 一、AlexNet卷积神经网络结构模型 1、数据库ImageNet 2、AlexNet第一层卷积层 二、AlexNet卷积神经网络的改进 1、非线性变化函数的改变——ReLU 2、最大池化(Max Pooling)概念的提出——卷积神经网络通用 1)池化层 2&#xff0…

C#委托——基础2

在上一篇随笔中,简要说明了怎样定义委托,定义事件,订阅事件,最后也实现了效果,就是当员工类的某个对象,执行某个事件时,委托事件被触发,后面也得到了结果,但是想象一下实…

机器学习——深度学习之编程工具、流行网络结构、卷积神经网络结构的应用

目录 一、编程工具 caffe实现LENET-5 二、流行的网络结构 1、VGGNET 2、Googlenet ​ 3、ResNet​ ​ 三、卷积神经网络的应用 1、人脸识别 ​ 2、人脸验证 3、人脸特征点检测 4、卷积神经网络压缩 一、编程工具 caffe的优点:模型标准化,源代码…

Halcon例程详解(激光三角系统标定)—— calibrate_sheet_of_light_calplate.hdev

前言 1 激光三角测距 激光三角测距法原理很简单,是通过一束激光以一定的入射角度照射被测目标,激光在目标表面会产生漫反射,在另一角度利用透镜对反射激光汇聚成像,光斑成像在CCD(Charge-coupled Device,感光耦合组件)位置传感器上。当被测物体沿激光方向发生移动时,…

【tenserflow】——数据类型以及常用属性

目录 一、什么是Tensor? 二、Tensorflow常见数据类型 三、Tensorflow常见属性device\cpu\gpu\ndim\shape\rank等 1、创建一个tensor 1)tf.constant() 2)tf.Variable() 2、判断一个变量是否为tensor张量 3、生成不同设备(cpu,gpu&#x…

网页开发浏览器兼容性问题

1、在ie6下的双margin问题 在ie6下,设置了float的元素,以float:left为例,如图所示。会出现第一个浮动元素,即相对于父级元素浮动的,会出现双倍margin的问题。 注意仅仅是相对于父级元素浮动的,即第一个会出…

【tensorflow】——创建tensor的方法

目录 1、tf.constant() 2、tf.Variable() 3、tf.zeros():用0去填充指定形状的数组 4、tf.convert_to_tensor(a,dtypetf.int32) 5、tf.ones():用1去填充指定形状的数组 6、tf.fill():用指定的元素去填充指定形状的数组 7、随机化初始化进行创建 1)normal正态分…

Halcon —— 图像像素类型与转换

图像类型 就目前工业领域主流的图像处理工具halcon来讲,有以下几种图像类型:‘byte’, ‘complex’, ‘cyclic’, ‘direction’, ‘int1’, ‘int2’, ‘int4’, ‘int8’, ‘real’, ‘uint2’,具体含义如下图所示。 ‘byte’ 每像素1字节…