机器视觉模型——投影矩阵

2023-05-16

1 概述

机器视觉就是用机器代替人眼和人脑来做测量和判断。机器视觉系统工作的基本过程是获取目标的图像后,对图像进行识别、特征提取、分类、数学运算等分析操作,并根据图像的分析计算结果,来对相应的系统进行控制或决策的过程。
在很多机器视觉应用中,都需要用到机器视觉测量,即根据目标的图像,来得到目标在实际空间中的物理位置,典型的如抓取机械手、行走机器人、SLAM等。
要根据图像中的目标像素位置,得到目标的物理空间位置,我们需要首先有一个图像像素坐标与物理空间坐标的映射关系,也就是将光学成像过程抽象为一个数学公式,这种能够表达空间位置如何映射到图像像素位置的数学公式,就是所说的机器视觉成像模型,本文即讨论这种模型的机理。

2 小孔成像

机器视觉成像采用小孔成像模型,如下图所示
图1:

在这里插入图片描述
再次简化为下图
图2:
在这里插入图片描述
图中 X X X是一个空间点, x x x为该空间点在图像中的成像点, C C C为镜头光心(camera centre),从图中可看到, C C C x x x X X X三个点是共线的。
光心 C C C距离成像面(image plane)的距离即焦距 f f f
后面的各个坐标系及其相互关系都是基于这个小孔成像模型推出。

3 坐标系

说到机器视觉测量模型,就少不了先要了解整个模型中涉及的几个坐标系。

3.1 像素坐标系uov

即图像中各像素点坐在的坐标系,如下图所示uov。
图3:
在这里插入图片描述
这个坐标系是一个二维坐标系,横坐标为图像宽度方向,纵坐标为图像高度方向,原点位于左上角,坐标轴单位为像素,与图像的像素点对应。

3.2 图像坐标系xoy

即图像传感器(如CMOS、CCD)坐标系,如下图所示xoy。
图4:
在这里插入图片描述
这个坐标系同样是一个二维坐标系,横坐标为传感器宽度方向,纵坐标为传感器高度方向,原点位于传感器中心,坐标轴单位为mm(根据实际需要设定,m、mm、……),后面的坐标系也都是同样单位,不再说明。
结合像素坐标系,我们可以得到下图
图5:
在这里插入图片描述
从此图中,我们可以得到像素坐标系uov与图像坐标系xoy的映射关系,即:
u = x / d x + u 0 v = − y / d y + v 0 u=x/dx+u_0\\ v=-y/dy+v0 u=x/dx+u0v=y/dy+v0
式中:
u 0 u_0 u0 v 0 v_0 v0——图像中心像素点坐标(通常为图像横纵向分辨率的一半,但如果镜头与传感器位置装偏了,就不是一半了),单位pixel;
d x dx dx d y dy dy——传感器单元的横纵向尺寸(即像元尺寸),单位mm/pixel,通常像元是正方形,就有 d x = d y dx=dy dx=dy
上式写成齐次矩阵形式,就是像素坐标系与图像坐标系的转换关系
[ u v 1 ] = [ 1 / d x 0 u 0 0 − 1 / d y v 0 0 0 1 ] [ x y 1 ] \left[\begin{matrix} u\\v\\1 \end{matrix}\right]= \left[\begin{matrix} 1/dx&0&u_0\\0&-1/dy&v_0\\0&0&1 \end{matrix}\right] \left[\begin{matrix} x\\y\\1 \end{matrix}\right] uv1=1/dx0001/dy0u0v01xy1
注意到以上公式中y方向加了个负号,是因为像素坐标系uov是个左手坐标系,但后面要讨论的三维坐标系都是采用右手坐标系,所以这里图像坐标系xoy直接设置为右手坐标系,负号是用来转换y轴方向。

3.3 相机坐标系 O C X C Y C Z C O_CX_CY_CZ_C OCXCYCZC

在相机镜头上设置一个三维坐标系,如下图,原点位于光心,X轴与Y轴分别与图像坐标系的x和y轴平行,Z轴指向物方(注:这是我习惯用的一种相机坐标系定义,另外一种比较常见的是Z指向物方,XY指向恰好与我图中的相反,好处是内参中没有我这里内参的两个负号)。
图6:
图2
根据前文的小孔成像模型,我们可以得到YOZ(YCZ)平面里的投影关系,如下图(XOZ平面同理)
图7:
在这里插入图片描述
上图中,根据相似三角形,有 f Z C = y Y C \frac{f}{Z_C}=\frac{y}{Y_C} ZCf=YCy以及 f Z C = x X C \frac{f}{Z_C}=\frac{x}{X_C} ZCf=XCx,因而可以写出相机坐标系与图像坐标系的转换关系,我们直接写为齐次坐标形式
[ x y 1 ] = [ f / Z C 0 0 0 0 f / Z C 0 0 0 0 1 / Z C 0 ] [ X C Y C Z C 1 ] = 1 Z C [ f 0 0 0 0 f 0 0 0 0 1 0 ] [ X C Y C Z C 1 ] \left[\begin{matrix} x\\y\\1 \end{matrix}\right]= \left[\begin{matrix} f/Z_C&0&0&0\\0&f/Z_C&0&0\\0&0&1/Z_C&0 \end{matrix}\right] \left[\begin{matrix} X_C\\Y_C\\Z_C\\1 \end{matrix}\right]=\frac{1}{Z_C}\left[\begin{matrix} f&0&0&0\\0&f&0&0\\0&0&1&0 \end{matrix}\right] \left[\begin{matrix} X_C\\Y_C\\Z_C\\1 \end{matrix}\right] xy1=f/ZC000f/ZC0001/ZC000XCYCZC1=ZC1f000f0001000XCYCZC1
式中: f f f——镜头焦距,有的文献里公式会把焦距分为X和Y向的 f x f_x fx f y f_y fy
代入前文的像素坐标系与图像坐标系的转换公式
[ u v 1 ] = [ 1 / d x 0 u 0 0 − 1 / d y v 0 0 0 1 ] [ x y 1 ] = 1 Z C [ 1 / d x 0 u 0 0 − 1 / d y v 0 0 0 1 ] [ f 0 0 0 0 f 0 0 0 0 1 0 ] [ X C Y C Z C 1 ] \left[\begin{matrix} u\\v\\1 \end{matrix}\right]= \left[\begin{matrix} 1/dx&0&u_0\\0&-1/dy&v_0\\0&0&1 \end{matrix}\right] \left[\begin{matrix} x\\y\\1 \end{matrix}\right]=\frac{1}{Z_C} \left[\begin{matrix} 1/dx&0&u_0\\0&-1/dy&v_0\\0&0&1 \end{matrix}\right] \left[\begin{matrix} f&0&0&0\\0&f&0&0\\0&0&1&0 \end{matrix}\right] \left[\begin{matrix} X_C\\Y_C\\Z_C\\1 \end{matrix}\right] uv1=1/dx0001/dy0u0v01xy1=ZC11/dx0001/dy0u0v01f000f0001000XCYCZC1
我们可以得到相机坐标系与像素坐标系的转换关系如下
[ u v 1 ] = 1 Z C [ f / d x 0 u 0 0 0 − f / d y v 0 0 0 0 1 0 ] [ X C Y C Z C 1 ] \left[\begin{matrix} u\\v\\1 \end{matrix}\right]=\frac{1}{Z_C} \left[\begin{matrix} f/dx&0&u_0&0\\0&-f/dy&v_0&0\\0&0&1&0 \end{matrix}\right] \left[\begin{matrix} X_C\\Y_C\\Z_C\\1 \end{matrix}\right] uv1=ZC1f/dx000f/dy0u0v01000XCYCZC1
我们用 M 1 M_1 M1表示公式中这个矩阵,同时从前面图6看到,图像实际上是从图中图像传感器的背面观测的,因此,需要给X向加个负号,有
M 1 = [ − f / d x 0 u 0 0 0 − f / d y v 0 0 0 0 1 0 ] M_1=\left[\begin{matrix} -f/dx&0&u_0&0\\0&-f/dy&v_0&0\\0&0&1&0 \end{matrix}\right] M1=f/dx000f/dy0u0v01000
这个矩阵中的参数只与镜头焦距 f f f、像元尺寸 d x d y dxdy dxdy、中心像素 u 0 v 0 u_0v_0 u0v0有关,这都是相机和镜头的内部参数,相机及镜头确定后这个矩阵就被确定,所以被称为内参矩阵

3.4 世界坐标系 O W X W Y W Z W O_WX_WY_WZ_W OWXWYWZW

世界坐标系是系统的绝对坐标系,同样是三维坐标系,原点及坐标轴方向根据我们需要来选定。
图8:
在这里插入图片描述
相机作为一个刚体,在世界坐标系中具有位姿——位置和姿态,位置即为相机(相机坐标系原点)相对于世界坐标系原点的平移,用一个3×1平移向量 T C T_C TC表达,姿态即为相机(相机坐标系)相对于世界坐标系的旋转,用一个3×3旋转矩阵 R C R_C RC表达
那么我们就可以得到相机坐标系与世界坐标系的关系
[ X W Y W Z W 1 ] = [ R C T C 0 1 × 3 1 ] [ X C Y C Z C 1 ] \left[\begin{matrix} X_W\\Y_W\\Z_W\\1 \end{matrix}\right]= \left[\begin{matrix} R_C&T_C\\0_{1×3}&1 \end{matrix}\right] \left[\begin{matrix} X_C\\Y_C\\Z_C\\1 \end{matrix}\right] XWYWZW1=[RC01×3TC1]XCYCZC1
反过来
[ X C Y C Z C 1 ] = [ R C T C 0 1 × 3 1 ] − 1 [ X W Y W Z W 1 ] = M 2 [ X W Y W Z W 1 ] \left[\begin{matrix} X_C\\Y_C\\Z_C\\1 \end{matrix}\right]= \left[\begin{matrix} R_C&T_C\\0_{1×3}&1 \end{matrix}\right]^{-1} \left[\begin{matrix} X_W\\Y_W\\Z_W\\1 \end{matrix}\right]=M_2\left[\begin{matrix} X_W\\Y_W\\Z_W\\1 \end{matrix}\right] XCYCZC1=[RC01×3TC1]1XWYWZW1=M2XWYWZW1
这就是世界坐标系与相机坐标系的转换关系,其中的矩阵 M 2 M_2 M2与相机的位姿有关,称为外参矩阵
代入前文的像素坐标系与相机坐标系的转换公式,得到
[ u v 1 ] = 1 Z C [ − f / d x 0 u 0 0 0 − f / d y v 0 0 0 0 1 0 ] [ X C Y C Z C 1 ] = 1 Z C [ − f / d x 0 u 0 0 0 − f / d y v 0 0 0 0 1 0 ] M 2 [ X W Y W Z W 1 ] \left[\begin{matrix} u\\v\\1 \end{matrix}\right]=\frac{1}{Z_C} \left[\begin{matrix} -f/dx&0&u_0&0\\0&-f/dy&v_0&0\\0&0&1&0 \end{matrix}\right] \left[\begin{matrix} X_C\\Y_C\\Z_C\\1 \end{matrix}\right]=\frac{1}{Z_C} \left[\begin{matrix} -f/dx&0&u_0&0\\0&-f/dy&v_0&0\\0&0&1&0 \end{matrix}\right]M_2 \left[\begin{matrix} X_W\\Y_W\\Z_W\\1 \end{matrix}\right] uv1=ZC1f/dx000f/dy0u0v01000XCYCZC1=ZC1f/dx000f/dy0u0v01000M2XWYWZW1

4 机器视觉投影矩阵

至此,我们就得到了像素坐标系与世界坐标系的映射关系,即机器视觉投影矩阵
[ u v 1 ] = 1 Z C M 1 M 2 [ X W Y W Z W 1 ] \left[\begin{matrix} u\\v\\1 \end{matrix}\right]=\frac{1}{Z_C} M_1M_2 \left[\begin{matrix} X_W\\Y_W\\Z_W\\1 \end{matrix}\right] uv1=ZC1M1M2XWYWZW1
其中:
Z C Z_C ZC——空间点在相机坐标系中的Z坐标
M 1 M_1 M1——内参矩阵,3×4矩阵, M 1 = [ − f / d x 0 u 0 0 0 − f / d y v 0 0 0 0 1 0 ] M_1=\left[\begin{matrix} -f/dx&0&u_0&0\\0&-f/dy&v_0&0\\0&0&1&0 \end{matrix}\right] M1=f/dx000f/dy0u0v01000
M 2 M_2 M2——外参矩阵,4×4矩阵, M 2 = [ r 11 r 12 r 13 t x r 21 r 22 r 23 t y r 31 r 32 r 33 t z 0 0 0 1 ] M_2=\left[\begin{matrix} r_{11}&r_{12}&r_{13}&t_x\\ r_{21}&r_{22}&r_{23}&t_y\\ r_{31}&r_{32}&r_{33}&t_z\\ 0&0&0&1 \end{matrix}\right] M2=r11r21r310r12r22r320r13r23r330txtytz1
模型建立后,其中的参数如何获取?这就涉及到下一个问题:《机器视觉-相机标定》

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

机器视觉模型——投影矩阵 的相关文章

  • 4.4.1内核编译

    内核源码下载地址 xff1a https mirrors edge kernel org pub linux kernel v4 x linux 4 4 1 tar gz 安装依赖包 xff1a 报错就装 cp boot config xx
  • fatal error: hugetlbfs.h: No such file or directory

    fatal error hugetlbfs h No such file or directory 解决办法 xff1a sudo apt get update sudo apt get install libhugetlbfs dev
  • WSL下 配置NFS-失败

    配置一个IP地址 xff1a sudo ip addr add 192 168 250 2 24 broadcast 192 168 250 255 dev eth2 sudo apt get install nfs kernel serv
  • OMT 对象模型、动态模型和功能模型

    对象模型描述系统中对象的静态结构 对象之间的关系 对象的属性 对象的操作 对象模型表示静态的 结构上的 系统的 数据 34 特征 对象模型为动态模型和功能模型提供了基本的框架 xff0c 对象模型用包含对象和类的对象图来表示 OMT的对象模
  • 关于epoll的调试的几个问题

    将今天调试的几个小问题点总结下 xff0c 后续遇到再添加 一 将总结的问题点放在最前面 1 epoll wait的maxevents参数 epoll wait的maxevents参数 xff0c 经过测试 xff0c maxevents的
  • poll函数测试

    一 基础知识 include lt poll h gt int poll struct pollfd fds nfds t nfds int timeout 其中参数fds指向一个结构体数组的第0个元素的指针 xff0c 每个数组元素都是一
  • IPC:匿名管道和命名管道

    一 管道初级测试 写两个小程序 xff0c 一个负责向管道发数据 xff0c 一个从管道接收数据 xff1b pipe cpp include lt iostream gt using namespace std int main cout
  • IPC:system V消息队列

    ftok函数 ftok convert a pathname and a project identifier to a System V IPC key SYNOPSIS include lt sys types h gt include
  • IPC:system V 信号量和共享内存

    信号量相关知识 结构体 union semun int val Value for SETVAL struct semid ds buf Buffer for IPC STAT IPC SET unsigned short array Ar
  • 信号signal编程测试

    信号会打断系统调用 xff0c 慎用 xff0c 就是用的时候测一测 下面是信号的基础测试 信号 信号 xff08 signal xff09 机制是UNIX系统中最为古老的进程之间的通信机制 它用于在一个或多个进程之间传递异步信号 信号可以
  • 线程间通讯的信号量semaphore.h

    sem init SEM INIT 3 Linux Programmer 39 s Manual SEM INIT 3 NAME sem init initialize an unnamed semaphore SYNOPSIS inclu
  • posix线程的优先级测试

    测试的时候 xff0c 如果创建的线程不够多 xff0c 有些问题体现不出来 xff0c 例如pthread cond signal和pthread cond broadcast 奇怪的优化是不会有好结果的 优先级打印 xff1a 测试目的
  • getpwent系统调用

    getpwent系统调用 NAME getpwent setpwent endpwent get password file entry SYNOPSIS include lt sys types h gt include lt pwd h
  • 调试信息:linux彩色调试信息的输出

    一 printf实现的宏 测试代码 xff1a include lt sys types h gt include lt pwd h gt include lt stdio h gt include lt stdlib h gt defin
  • UML里面静态建模及动态建模都有哪些图?

    静态建模 xff1a 创建并建立一个系统的静态特征 1 用例图 xff1a 描述系统功能及功能的使用者 2 类 图 xff1a 表现系统里实体的关系 责任 类和类之间的关系 xff0c 属性及方法 3 对象图 xff1a 当类图不能完全显示
  • warning: ISO C++11 requires at least one argument for the “...“ in a variadic macro

    关于警告 xff1a warning ISO C 43 43 11 requires at least one argument for the 34 34 in a variadic macro 相关代码如下 xff0c 把下面的代码放到
  • IMX6开发板设置DHCP功能和验证DNS功能

    一 udhcpc命令 root 64 host udhcpc help BusyBox v1 29 3 2022 11 09 15 51 05 CST multi call binary Usage udhcpc fbqRB a MSEC
  • 常用端口号/etc/services

    etc services文件存储的内容 记录一下 xff0c 防止忘记 etc services Id services v 1 1 2004 10 09 02 49 18 andersen Exp Network services Int

随机推荐

  • 网络字节序和主机字节序转换函数

    大小端判断 include lt stdio h gt include lt stdint h gt int is little endian union uint32 t num uint8 t c e e num 61 1 return
  • 在ubuntu连接Xlight FTP Server

    一 在windows上搭建服务器 http www xlightftpd com download htm 使用英文版 xff0c 使防止在ubuntu中登录中文版时 xff0c 显示乱码 新建用户和用户对应的服务器目录 如下所示 xff0
  • xinetd服务

    检查xinetd服务是否安装 lkmao 64 ubuntu ps au grep xinetd lkmao 2536 0 0 0 1 11760 2172 pts 0 S 43 06 17 0 00 grep color 61 auto
  • ssh免密登录mobaxterm使用方法

    1 如果要在服务器上添加两个公钥 xff0c 在服务器 ssh authorized keys上添加公钥 xff0c 在第一个公钥的下一行添加第二个公钥即可 xff1b 2 在mobaxterm上使用公私钥免密登录时 xff0c 需要在se
  • eclipse和ubuntu使用小技巧

    1 在当前界面查找某一关键字ctrl 43 f 然后在当前界面切换关键字下一个是ctrl 43 k 上一个是ctrl 43 shift 43 k 2 打开一个新的页面要激活输入法切换是ctrl 43 sapce
  • 关于pixhawk2.1+px4 1.7.3stable出现mag sensors inconsistent问题分析

    因为前两天在学校测试代码时 xff0c 飞机在mission模式下突然出现在每一个mission点都会停留两三分钟的问题 xff0c 而且偏航还一直在旋转 xff0c QGC上也会提示mag sensors inconsistent 于是考
  • px4+pixhawk2.1使用出现无sensors问题

    今天外场试飞突然发现地面站无法检测到sensors xff0c 距离上一次正常试飞没有进行任何操作 xff0c 怀疑可能是飞控板子上面的cube接触不良 xff0c 于是重新安装了下还是不能解决问题 xff0c 重新刷px4官方固件也是不能
  • Ubuntu安装之后卡顿解决方法

    前两天刚为电脑装了Ubuntu18 04 xff0c 然后发现很卡 这就奇怪了 xff0c 我这电脑在Windows运行还挺流畅的 xff0c 难道是系统是真的卡 xff1f 后来百度之后 xff0c 发现可能是以下两点原因 xff1a 1
  • AdGuard Home 安装使用教程

    原文链接 xff1a 使用 Envoy 和 AdGuard Home 阻挡烦人的广告 通常我们使用网络时 xff0c 宽带运营商会为我们分配一个 DNS 服务器 这个 DNS 通常是最快的 xff0c 距离最近的服务器 xff0c 但会有很
  • gdb调试段错误

    https blog csdn net Deutschester article details 6739861
  • 嵌入式开发:C++在深度嵌入式系统中的应用

    深度嵌入式系统通常在C语言中实现 为什么会这样 这样的系统是否也能从C 43 43 中获益 嵌入式开发人员在将广泛 高效的深度嵌入式代码库从C转换为C 43 43 方面的实践经验的贡献 嵌入式和深度嵌入式系统通常用C而不是C 43 43 实
  • Kalman滤波在船舶GPS导航定位系统中的应用

    matlab程序如下 xff1a function GPS clc clear T 61 1 雷达扫描周期 N 61 80 T 总采样次数 X 61 zeros 4 N 目标真实位置 速度 xff08 X Vx xff0c Y Vy xff
  • 通信协议详解(一):UART串口(协议+数据格式+设计实现)

    uart串口通信协议及verilog实现 文章目录 一 uart串口通信简介二 串口传输1 数据协议2 整体架构 三 串口传输实现1 发送模块2 接收模块 四 串口收发仿真总结 一 uart串口通信简介 通用异步收发器 UART xff08
  • Asterisk PJSIP中继(IMS)呼叫开启VoLTE手机出现一接通就自动挂机问题

    目录 一 问题描述 二 分析过程 1 网络抓SIP协议包 三 解决办法 版权声明 本文为博主 宽简厚重 Yuesichiu 原创文章 未经博主允许不得转载 https blog csdn net yuesichiu article deta
  • Asterisk支持从P-Preferred-Identity/P-Asserted-Identity/Remote-Party-ID中获取CID和DID

    一 概述 nbsp nbsp nbsp nbsp 主叫身份识别是指用于给被叫用户显示主叫呼入信息 被叫身份识别是指被叫接收到远端呼入后 如何识别被叫信息确实是呼叫自身 在IMS中 针对From To头域比较淡化 作为主被叫识别的关键头域为新
  • Asterisk修改res_pjsip以支持IMS VoLTE tel URI Scheme

    一 概述 nbsp nbsp Asterisk 13 0 0到Asterisk 16 15 0这些官方版本都是不支持IMS VoLTE tel URI scheme RFC3966 假如将Asterisk部署在这几个版本环境中不可避免地会遇
  • OpenCV图像处理——拉普拉斯金字塔

    拉普拉斯金字塔主要用于重建图像 xff0c 拉普拉斯就是为了在放大图像的时候 xff0c 可以预测残差 xff0c 何为残差 xff0c 即小图像放大的时候 xff0c 需要插入一些像素值 xff0c 在上文直接插入的是 0 xff0c 拉
  • OpenCV图像处理——数字图像处理基本操作

    1 读取和显示图像 xff1a 1 1 cv2 imread 函数 xff0c 原型 xff1a cv2 imread filename flags 参数 xff1a filepath xff1a 读入imge的完整路径 flags xff
  • 海思平台水印功能实现之二定时器Timer

    定时器可以自己创建或者直接使用POSIX Timer 我们这边水印每隔1秒刷新时间的时候使用的是POSIX Timer POSIX timer相关的操作 主要包括创建一个timer timer create 设定timer timer se
  • 机器视觉模型——投影矩阵

    1 概述 机器视觉就是用机器代替人眼和人脑来做测量和判断 机器视觉系统工作的基本过程是获取目标的图像后 xff0c 对图像进行识别 特征提取 分类 数学运算等分析操作 xff0c 并根据图像的分析计算结果 xff0c 来对相应的系统进行控制