坐标系转换
这一部分就是理论核心了,在理论核心讲解完之后,我就会对代码进行讲解
图像像素坐标系 → 图像物理坐标系(离散化)
像素坐标系的原点在左上角,并且单位为像素。像素坐标系和图像坐标系都在成像平面上,只是各自的原点和度量单位不一样。图像坐标系的原点为相机光轴与成像平面的交点,通常情况下是成像平面的中点或者叫principal point。图像物理坐标系的单位是mm,属于物理单位,而像素坐标系的单位是pixel,我们平常描述一个像素点都是几行几列


这个内参矩阵就是我们图像坐标系向相机坐标系转换的一个核心矩阵
通过第一个矩阵,也就是
我们可以实现图像坐标系的转换
关于像素坐标( u , v ) 到图像坐标( x , y ) 的仿射变换就是上面的式子了,有了这个概念
相机坐标系其实无非就是多了一个Z方向的数据,(x,y)上的数据是一样的
什么?你不会矩阵的计算,去b站看看宋浩吧,或者网上查一查,矩阵的运算并不复杂
相机坐标系的转换

我们通过相似三角形的知识,很简单就能算出一些东西
比如:如果你知道P的距离也就是 Oxy和 Op 的距离,那么Xc就可求,相反的,知道Xc就可以求 Oxy和 Op 的距离
你不会相似三角形?那你得回初中补补知识了
这样,只要知道Xc的值,我们就可以知道Zc的值了,这样我们相机坐标系所需要的深度信息就满足了
这样我们就可以实现图像像素坐标系到相机坐标系的转换了
Zc可以通过深度相机获取(包括但不限于双目、双目结构光、单目结构光等相机),普通的工业相机还可以借助PnP求解法
我们所使用的就是PnP算法进行解算
solvePnP
bool solvePnP( InputArray objectPoints, InputArray imagePoints,
InputArray cameraMatrix, InputArray distCoeffs,
OutputArray rvec, OutputArray tvec,
bool useExtrinsicGuess = false, int flags = SOLVEPNP_ITERATIVE );
作用:根据3D-2D点对应关系,获得物体的位姿。 此函数返回旋转和平移向量,可用来将物体坐标系中的3D点变换到相机坐标系下。

这里就是我们在应用中的一大核心了,3D和2D之间转换,可以看到图上有4个空间坐标点,通过这些坐标点
我们就可以知道物体的位姿,为什么呢?因为就和2点可以确定唯一条直线一样,4个空间坐标点足以确定一个坐标系
这里需要注意的是,3D坐标我们是不知道的,是我们自己给定的,在代码讲解部分会有讲解
世界坐标系的转换
这个部分主要是我们从相机坐标系向世界坐标系转变的过程
其实最最关键的部分在于旋转矩阵



上面就是围绕三个轴的旋转,这个计算量很小,自己算一遍就可以理解了,但是不想要每次都乘3个矩阵来计算怎么办
很简单,把三个旋转矩阵先相乘再和坐标相乘,放心,不会有影响,乘法的顺序只会影响旋转的顺序
所以,这里不得不说 "万向锁" 的问题,你可以自己查阅,我会在代码讲解部分进行说明,不会在这里讲解