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

一、前言

视觉系统一共有四个坐标系:像素平面坐标系(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,一经查实,立即删除!

相关文章

numpy——ravel()和flatten()

目录 功能 用法 区别 flatten() ravel() 功能 这两个函数的功能都是将多维数组转换成一维 用法 import numpy as np arr np.array([[1, 2],[3, 4]]) arr.flatten()降维默认行序优先,传入参数‘F’表示列序优先 arr.flatten(F) arr.r…

Django的model中日期字段设置默认值的问题

之前写过这样一个model: class MonthlyFeeMember(models.Model):worker models.ForeignKey(Student, verbose_nameu"worker", related_name"as_monthly_fee_members")month models.CharField(umonth, max_length10, defaultget_current_month…

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

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

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树…

Redis failover过程

在Leader触发failover之前,首先wait数秒(随即0~5),以便让其他sentinel实例准备和调整。如果一切正常,那么leader就需要开始将一个salve提升为master,此slave必须为状态良好(不能处于SDOWN/ODOWN状态)且权重值最低(redis.conf中)的…

机器学习——深度学习之卷积神经网络(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…

POJ - 3470 Walls

小鸟往四个方向飞都枚举一下,数据范围没给,离散以后按在其中一个轴线排序,在线段树上更新墙的id,然后就是点查询在在哪个墙上了。 这题有个trick,因为数据范围没给我老以为是inf设置小了,WA了很多发。&…

C# —— 深入理解委托类型

一. 委托定义 1. 委托与多播委托 委托类型表示对具有特定参数列表和返回类型的方法的引用,定义了委托实例可以调用的某类方法。 通过委托,我们可以动态的通过委托变量来调用委托方法。一般用delegate来命名委托类型,但Action和Func也可以达到同样的效果…

【VS开发】【C++语言】reshuffle的容器实现算法random_shuffle()的使用

假设你需要指定范围内的随机数,传统的方法是使用ANSI C的函数random(),然后格式化结果以便结果是落在指定的范围内。但是,使用这个方法至少有两个缺点。首先,做格式化时,结果常常是扭曲的,所以得不到正确的随机数&…

C#委托——基础2

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