摄像机标定04_从单幅图像中提取世界坐标

2024-04-10 21:58

本文主要是介绍摄像机标定04_从单幅图像中提取世界坐标,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

从单幅图像中提取世界坐标

从原理上来说,使用标定后的摄像机可以在世界坐标系内进行未失真的测量。一般情况下只有使用多个摄像机在不同空间位置上同时拍摄同一物体的两幅或多幅图像,才可以进行这种测量,这种方式被称为立体重构。使用这种方法重构两幅图像中对应点的三维位置是可以实现的,因为两个摄像机光心与两幅图像中在成像平面上的对应点可以定义两条光线,这两条光线在三维空间中的交点就是图像中相应点的三维位置。
要是只有一个摄像机呢?
第一就是使用远心镜头拍摄被测物体;
第二就是如果使用针孔摄像机或线阵摄像机,此时必须将被测物体放在一个已知平面上(如传送带 )上。
这两种情况都可以通过光线(视线)与已知被测平面相交来解决问题。就算测量平面与光轴之间有一定的倾斜角度,也可以进行测量。

(1)使用远心镜头拍摄被测物体:这种情况下,平行投影完全不受深度信息的影响。因此,不能得到物体在摄像机坐标系中的 z 坐标。然而我们可以得到物体在摄像机坐标系中的x y 坐标,也就得到了物体在世界坐标系中的尺寸。将点Pc看做是世界坐标系中的一个点即可,为了求得 Pc 的坐标,我们可以首先将该点从图像坐标系转换到成像平面坐标系:

(uv¯)=(sx(ccx)sy(rcy))

然后消除径向畸变的影响,得到成像平面上未失真的坐标 (u,v)T ,最终计算得到点 Pc 的坐标为:
Pc=(xc,yc,zc)T=(u,v,0)T

注意上面的方法其实就相当于通过点 (u,v,0)T 并且于成像平面 (0,0,1)T 垂直的光线与平面 z=0 相交得到的交点。
(2)使用针孔摄像机确定目标物体的世界坐标稍微复杂一些,不过原理相同,也是将光线与已知平面相交。
在很多应用中,被测物体都放在摄像机前面的一个平面上,如传送带。如果我们想在这个平面上测量物体,那么就需要得到这个平面所定义的世界坐标系中的坐标。原理上讲,我们需要使用图像上某点所对应的的光线与该测量平面相交。所以我们需要知道定义该光线的两个点。从透视投影的模型中易知,第一个点就是摄像机的投影光心,在摄像机坐标系中的坐标为 (0,0,0)T 。第二个点的坐标我们需要将点 (r,c)T 从图像坐标系转换到成像平面坐标系中。为了得到该点在成像平面上对应的空间点坐标,我们要考虑成像平面在光心前,距离光心 f 处,因此,光线上第二个点的坐标为(u,v,f)T。因此,我们可以使用下式来表示摄像机坐标系中的这条光线:
Lc=(0,0,0)T+λ(u,v,f)T

为了将这条光线与测量平面相交,最好将光线 Lc 的方程建立在世界坐标系中,因为在世界坐标系中测量平面就是 z=0 。因此我们需要将两个点 (0,0,0)T (u,v,f)T 转化到世界坐标系中。
Pc=RPw+T 的逆变换
Pw=R1(PcT)=RT(PcT)

式中, R1=RT Pc=RPw+T 中旋转矩阵 R 的逆矩阵。我们称转换后的光心为Ow,也就是说
Ow=RT((0,0,0)TT)=RTT 。将转换到成像平面上的点称为 Iw ,也就是说 Iw=RT((u,v,f)TT) ,这时,这条光线在世界坐标系中表示为
Lw=Ow+λ(IwOw)=Ow+λDw

式中, Dw 表示光线的方向向量。由此得到光线与测量平面 z=0 的交点了,交点的坐标为:
Pw=oxozdx/dzoyozdy/dz0

式中,
Ow=(ox,oy,oz)T
Dw=(dx,dy,dz)T

以上所讨论都是基于被测物体的测量平面的位姿已知。幸运的是由于我们使用平面标定对象,可以通过摄像机标定得到这个位姿。如果在用来标定的其中一幅图像中标定板直接放在测量平面上(如传送带)上,那么这幅图像中标定板的外参基本就等同于上面所需要的测量平面的位姿。当然只有标定对象厚度可以忽略的情况下,才能直接使用标定对象的外参作为测量平面的位姿。如果考虑到标定对象的厚度,这个外参确定的世界坐标系必须沿其 z 轴正方向在移动标定板的厚度。

除了可以将图像中某些点转换到世界坐标系中,例如将一维边缘位置或亚像素精度轮廓线转换到世界坐标系中,还可以将图像本身转换到世界坐标系中。这个转换得到的图像就相当于摄像机在于世界平面绝对垂直并且镜头不存在任何畸变的情况下拍摄得到的图像。这种图像校正在一些需要使用图像本身进行处理的应用中非常有用,例如需要在校正后的图像中进行区域处理、模块匹配或光学字符识别(OCR)等。为了进行图像校正,原理上我们在世界坐标系中平面z=0中截取一个矩形区域,然后在矩形区域中每隔一个指定距离( 200um )抽取一个点。这些抽取样点使用相应的摄像机模型投影到图像中,然后通过插值算法(如双线性内插算法)得到该点的灰度值。
这里写图片描述

这篇关于摄像机标定04_从单幅图像中提取世界坐标的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/892254

相关文章

C#提取PDF表单数据的实现流程

《C#提取PDF表单数据的实现流程》PDF表单是一种常见的数据收集工具,广泛应用于调查问卷、业务合同等场景,凭借出色的跨平台兼容性和标准化特点,PDF表单在各行各业中得到了广泛应用,本文将探讨如何使用... 目录引言使用工具C# 提取多个PDF表单域的数据C# 提取特定PDF表单域的数据引言PDF表单是一

C#实现添加/替换/提取或删除Excel中的图片

《C#实现添加/替换/提取或删除Excel中的图片》在Excel中插入与数据相关的图片,能将关键数据或信息以更直观的方式呈现出来,使文档更加美观,下面我们来看看如何在C#中实现添加/替换/提取或删除E... 在Excandroidel中插入与数据相关的图片,能将关键数据或信息以更直观的方式呈现出来,使文档更

基于WinForm+Halcon实现图像缩放与交互功能

《基于WinForm+Halcon实现图像缩放与交互功能》本文主要讲述在WinForm中结合Halcon实现图像缩放、平移及实时显示灰度值等交互功能,包括初始化窗口的不同方式,以及通过特定事件添加相应... 目录前言初始化窗口添加图像缩放功能添加图像平移功能添加实时显示灰度值功能示例代码总结最后前言本文将

Java后端接口中提取请求头中的Cookie和Token的方法

《Java后端接口中提取请求头中的Cookie和Token的方法》在现代Web开发中,HTTP请求头(Header)是客户端与服务器之间传递信息的重要方式之一,本文将详细介绍如何在Java后端(以Sp... 目录引言1. 背景1.1 什么是 HTTP 请求头?1.2 为什么需要提取请求头?2. 使用 Spr

使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)

《使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)》在现代软件开发中,处理JSON数据是一项非常常见的任务,无论是从API接口获取数据,还是将数据存储为JSON格式,解析... 目录1. 背景介绍1.1 jsON简介1.2 实际案例2. 准备工作2.1 环境搭建2.1.1 添加

python解析HTML并提取span标签中的文本

《python解析HTML并提取span标签中的文本》在网页开发和数据抓取过程中,我们经常需要从HTML页面中提取信息,尤其是span元素中的文本,span标签是一个行内元素,通常用于包装一小段文本或... 目录一、安装相关依赖二、html 页面结构三、使用 BeautifulSoup javascript

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

取得 Git 仓库 —— Git 学习笔记 04

取得 Git 仓库 —— Git 学习笔记 04 我认为, Git 的学习分为两大块:一是工作区、索引、本地版本库之间的交互;二是本地版本库和远程版本库之间的交互。第一块是基础,第二块是难点。 下面,我们就围绕着第一部分内容来学习,先不考虑远程仓库,只考虑本地仓库。 怎样取得项目的 Git 仓库? 有两种取得 Git 项目仓库的方法。第一种是在本地创建一个新的仓库,第二种是把其他地方的某个

Verybot之OpenCV应用一:安装与图像采集测试

在Verybot上安装OpenCV是很简单的,只需要执行:         sudo apt-get update         sudo apt-get install libopencv-dev         sudo apt-get install python-opencv         下面就对安装好的OpenCV进行一下测试,编写一个通过USB摄像头采

浙大数据结构:04-树7 二叉搜索树的操作集

这道题答案都在PPT上,所以先学会再写的话并不难。 1、BinTree Insert( BinTree BST, ElementType X ) 递归实现,小就进左子树,大就进右子树。 为空就新建结点插入。 BinTree Insert( BinTree BST, ElementType X ){if(!BST){BST=(BinTree)malloc(sizeof(struct TNo