——2020.10.20

开始学习SLAM。想着从SLAM开始然后做三维重建。前面的李群李代数以及旋转四元数有点复杂。都看过了一遍。但不太理解就先放放。希望接下去能够顺利进行。数学基础可能不是很好,公式推导书中以及写得十分详细,主要是记录我看SLAM的笔记,以及一些理解。

相机通过把三维世界的坐标点映射到二维图像平面。从单位米到单位像素。这个过程能够用一个几何模型进行描述。我们从最简单的针孔相机模型说起。

设O-x-y-z为相机坐标系。O为摄像机的光心,也就是摄像头的针孔。现实世界的空间点的P,经过小孔O投影之后成像P‘。因为成的是倒像所以要加一个负号。我们对所成的像进行关于O点镜像对称。

大多数的相机输出的图像都不是倒像——相机自身的软件会帮你反转,所以也就是对称的成像平面。在相机中,我们最终获得的是一个一个的像素,我们要对他进行采样以及量化。我们在物理成像平面固定一个像素平面o-u-v。我们在像素得到P‘的像素坐标。

像素坐标系通常的定义方式:原点o’位于图像的左上角,u轴向右,v轴向下。像素坐标系与成像平面直接差了一个缩放和一个原点的平移。

上面是关于相机内参的推导方式。上式中的K便是相机内参(内参数矩阵)。相机的内参在出厂后便已经确定。我们也可以通过标定的方式来确定相机内参。除了内参之外还有对应的外参。我们使用的P是在相机坐标系下的坐标。但是,因为相机是在世界坐标系下运动的,所以,相机的位置需要用相机的旋转矩阵以及位移组成。

所以上式中对应的R,t便是相机的外参,随相机的运动而变化。然后我们对其进行归一化处理之后。得到对应的二维齐次坐标Pc=[x/z,y/z,1]T,便是对应屏幕上的uv坐标。

为了得到更好的成像效果,我们需要在镜头前增加一层透镜,这样会导致对图形有影响。也就是会产生畸变。而畸变分为两种一种是径向畸变,第二种就是切向畸变。第一种导致的原因是光线在穿过透镜的时候会导致光线的折射,导致原先在现实生活中的直线在图像中呈曲线。这种现在越靠近边缘越明显,又因为透镜成中心对称,则在图像中呈径向对称。又分为两种一种是桶形畸变,一种是枕形畸变。桶形是由于图像放大率随着光轴的距离增加而减小,枕形则反之。

在相机组装过程中不能使得透镜和成像平面严格平行会引入切向畸变。

我们可以用数学表达式对其进行表述。可以用笛卡尔坐标系以及极坐标的形式来对屏幕上面的点进行描述。[X,Y]T->[Xcorrected,Ycorrected]T这个过程就是纠正过后的坐标。要注意他们现在是归一化平面上的点,不是像素平面上的点。

上式是对应的径向畸变的坐标调整公式。对于畸变比较小的图像中心区域,畸变主要是k1起作用。对于畸变比较大的边缘区域则是k2起作用。对于畸变比较大的镜头采用k3.下面则是切向畸变对坐标的调整。主要由系数p1,p2进行修正.

通过我们学习上面的两个模型,针孔相机模型以及畸变模型。我们可以把整个过程进行梳理。从相机坐标系(X,Y,Z)->像素平面(u,v)
1.将三维空间点投影到归一化图像平面。
2.对归一化平面上的进行径向畸变和切向畸变纠正。

3.将纠正后的点通过内参数矩阵投影到像素平面。得到该点在图像平面的正确位置。

我们可以选择先对图像进行去畸变,然后讨论他在空间中的位置。也可以先考虑图像中的某个点。进行去畸变,然后讨论他在空间中的位置。

双目相机模型
通过左右摄像机得到视差来判断物体距离我们的位置,计算得到视差之后估计每一个像素的深度。

在左右摄像机,我们可以把他们看成两个针孔相机。他们是水平放置的,意味着两个相机的光圈中心位于x轴上,他们之间的距离称为双目摄像机的基线。现在空间中一点P,在左眼以及右眼中各呈一像。由于基线的存在,两个成像位置不同,理想情况下,两个像只有在x轴上有差异。

视差与距离成反比,视差越大,距离越远。由于最小视差是一个像素,于是深度具有一个理论最大值。由fb决定。实际上看上去公式十分的简洁,但是d在u行中不好确定。可能双目估计需要使用GPU或FPGA来计算。

RGB-D相机

1.红外结构光。
2.飞行时间法(ToF)。
RGB-D都需要向探测目标发射一束光线。在结构光中,根据返回的结构光图案,计算物体与自身的距离。飞行时间法,通过计算光线返回时间,ToF能直接对整个图像发射激光得到深度。而不用逐一像素进行发射。RGB-D需要多个相机进行放置,同时因为条件过于苛刻,为了排除户外因素必须在室内,对于透明的物体因为接受不到反射光则无法确定其位置。

图像
我们从灰度图开始说起。每个像素位置对应一个灰度值。用一个字节来表示我们可以用二维矩阵来表示可以设定第一个下标为行,第二个下标为列。然后在像素平面内原点在左上角。但当我们想记录比颜色更多的信息的时候我们的一个字节就不够用了。比如说我们需要记录深度可能需要用十六位整数进行记录。当我们使用彩色图片的时候,则需要通道的概念此时RGB便需要24位,3个字节。当有透明度的时候则又要增加一位。用通道的方式进行访问。

各种相机以及图片-SLAM14CP5的更多相关文章

  1. coco2dx jni 调用 java 相机返回 图片数据

    新建 一个项目 名字:testJin  包名:com.TanSon.org  python命令:python create_project.py -project testJin -package c ...

  2. AR_Demon(使用vuforia平台提供的钥匙跟后台,实现相机拍图片读取模型以及视频的功能)

    1.https://developer.vuforia.com注册账号. 2.分别添加License Manager(连接钥匙),Target Manager(图片后台下载). 3.下载vuforia ...

  3. 【Xamarin】MonoTouch - iOS 使用 UIImagePickerController 打开图片库和相机选择图片修改头像

    Application tried to present modally an active controller <UIImagePickerController: 0x7b6ff400> ...

  4. 图片Exif 信息中Orientation的理解和对此的处理

    这个问题是在用七牛上传图片后获取宽高时发现的,一张图片,用图片浏览器打开始终是竖图,但是查看属性或者用七牛获取宽高,却发现宽大于高,也就是在属性中这是个横图.这样导致客户端用该宽高来展示图片会出现问题 ...

  5. Android实现图片裁切

    介绍 在应用开发中,如果涉及到个人信息,头像一般是不可避免的,类似这种情况,我们就需要用到图片裁切的功能,实现头像裁切,然后上传给服务器. 一般裁切的做法就是图层叠加选取框,然后根据坐标,计算裁切区域 ...

  6. Android中通过访问本地相册或者相机设置用户头像

    目前几乎所有的APP在用户注册时都会有设置头像的需求,大致分为三种情况: (1)通过获取本地相册的图片,经过裁剪后作为头像. (2)通过启动手机相机,现拍图片然后裁剪作为头像. (3)在APP中添加一 ...

  7. mui开发app之js将base64转图片文件

    之前我已经做过一个利用cropper裁剪并且制作头像的功能.如何在mui app中实现相册或相机获取图片后裁剪做头像请看另一篇博客:mui开发app之cropper裁剪后上传头像的实现 但是当时裁剪后 ...

  8. 如何兼容所有Android版本选择照片或拍照然后裁剪图片--基于FileProvider和动态权限的实现

    我们知道, Android操作系统一直在进化. 虽然说系统是越来越安全, 可靠, 但是对于开发者而言, 开发难度是越来越大的, 需要注意的兼容性问题, 也越来越多. 就比如在Android平台上拍照或 ...

  9. iOS中 读取相册,调用系统相机 技术分享

    技术内容:分别读取相册以及调取相机,将图片显示到imageView上 布局: 1.创建imageView 和 button 并为button一个关联pickerImage的事件 <div sty ...

  10. KITTI数据集的使用——雷达与相机的数据融合

    目录 目的 如何实现 kitti数据集简介 kitti数据集的raw_data 利用kitti提供的devkit以及相应数据集的calib文件 解读calib文件夹 解读devkit 目的 使用雷达点 ...

随机推荐

  1. 10个.NetCore实用的开源框架项目

    今天我们一起梳理下10个,比较受到大家欢迎的.NetCore开源框架项目.1.FytSoaCms 前后端分离CMS系统 项目简介 这是一个基于.Net 3构建的简单.跨平台.模块化建站系统.系统业务简 ...

  2. 前台主页功能-前台轮播图功能完成-git介绍和安装-git使用流程-git常用命令-git忽略文件

    目录 前台主页功能-前台轮播图功能完成-git介绍和安装-git使用流程-git常用命令-git忽略文件 昨日内容回顾 今日内容概要 今日内容详细 0 导出项目依赖 0 学长问题解析 1 前台主页功能 ...

  3. gitlab 安装以及汉化

    转载 https://www.bbsmax.com/A/pRdBAg465n/

  4. 【转载】rename。给文件批量改名的python脚本

    https://www.bilibili.com/read/cv16146757 确认py版本:2.7, 3.6? 1 import os, sys, re, math, openpyxl, csv ...

  5. 使用 FreeSSL 申请免费证书

    官网 https://freessl.cn/ 首先,注册一个账户 然后登录 输入自己的域名,选择第2个"亚洲诚信"(1年),然后点击"创建免费SSL证书"按钮 ...

  6. BUU刷题记录

    [GWCTF 2019]mypassword xss+csp 打开页面可以注册登录 登进去提示不是sql注入 然后提示源码 看一下 然后有段后端代码写道了注释里 <!-- if(is_array ...

  7. MTK平台总结

    1. 通过cmdline参数不对printk打印速率进行限制:mt_boot.c kcmdline_append(" ignore_loglevel=1 printk.devkmsg=on ...

  8. 前端性能测试lighthouse的使用

    lighthouse的安装有两种方式: github地址:https://github.com/GoogleChrome/lighthouse 一.如果可以FQ的话可以从 chrome 扩展插件里直接 ...

  9. 并发多线程学习(三)Java多线程入门类和接口

    1 Thread类和Runnable接口 上一章我们了解了操作系统中多线程的基本概念.那么在Java中,我们是如何使用多线程的呢? 首先,我们需要有一个"线程"类.JDK提供了Th ...

  10. CSV文件乱码处理方法

    如果csv出现乱码, 直接用记事本打开另存为的格式从utf-8变为ANSI模式即可. 然后再打开