针孔相机模型成像原理与图像变形矫正教程
相机成像原理与焦距概念
针孔相机的本质就是初中学过的小孔成像,镜头是一个小孔,然后光线透过小孔被感光传感器所捕获。当然以前的相机是通过胶片来捕获光线。虽然各个时代的相机记录图像的技术不一样,但是不变的都是利用小孔成像这个原理来将外面的三维的大图像缩小到一个二维的小照片上。相信你不会对下面这个图陌生,比较初中物理书上必备这个。
真实图像各个像素点的位置与照片里面的图像的位置对应关系是由下面这个红色的相似三角形所决定。
相机里面那个小三角形的直角边叫做焦距,经常听到的调焦距对焦就弄的是这个恰当的焦距才能更好的成像。
现在有个问题了,它是倒立的像,而我们平常看到的照片很正常。这是因为相机自动给我们翻转了图像,最古老的相机它拍照的时候是倒过来的。接下来定量的分析照片上的点与实际图像点之间的长度关系。
针孔相机数学模型
从这个相似三角形我们可以看到实际物体坐标与它们在相机中的坐标对应关系。注意:物体的坐标是三维,但是照片上的坐标只有2维。x′=−f∗(xd)x'=-f*(\frac x d)x′=−f∗(dx),之所以有个负号是因为他们是倒立的,所以坐标的符号发生变化。由于我们平常接触到的照片并不是倒立的所以照片上的坐标计算公式为x′=f∗(xd)x'=f*(\frac x d)x′=f∗(dx)。不同相机的焦距f是不一样的,所以这个参数叫做相机的内参。它对于我们根据照片来三维重建原先的物体非常重要。这个相机的内参一般厂家会提供,如果没有那就得我们自己用相机对标定板拍照,然后根据照片来计算出相机的焦距。
我们平常有用的坐标系都是长这样的:
但是在计算机图像图形领域用的坐标系是长这样的,坐标系原点在相片的左上角:
我们之前写的x′=−f∗(xd)x'=-f*(\frac x d)x′=−f∗(dx)这个公式,它坐标系原点是和焦点在同一条线上即相片的中心。但是我们存储相片的时候用的坐标系却是计算机图像坐标系。所以我们得把针孔模型的坐标变换到计算机图像坐标系中。这个其实非常简单,因为本质上就是把整个坐标系进行了平移,和翻转了一下。假设原先针孔相机模型的各像素的坐标是[x’,y’],而存储的计算机图像坐标系坐标为[u,v]。
他们之间的对应关系就是平移了一下,翻转了一下。用公式表示就是:u=ax′+cx,v=by′+cyu=ax'+c_x,v=by'+c_yu=ax′+cx,v=by′+cy。然后把x′=f∗(xd)x'=f*(\frac x d)x′=f∗(dx)代入得到u=a×f×(xd)+cx,v=b×f×(yd)+cyu=a×f×(\frac x d)+c_x,v=b×f×(\frac y d)+c_yu=a×f×(dx)+cx,v=b×f×(dy)+cy,我们把x,y前面的系数合并为u=fx×(xd)+cx,v=fy×(yd)+cyu=f_x×(\frac x d)+c_x,v=f_y×(\frac y d)+c_yu=fx×(dx)+cx,v=fy×(dy)+cy。
在计算机里面喜欢用矩阵来存储公式。上面那个变换公式可以写成矩阵形式(用的是齐次坐标):
(uv1)=1d(fx0cx0fycy001)(xyd)=1dKP\begin{pmatrix} u \\ v \\ 1 \end{pmatrix}=\frac 1 {d} \begin{pmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{pmatrix}\begin{pmatrix} x \\ y \\ d \end{pmatrix}=\frac 1 {d} KP⎝⎛uv1⎠⎞=d1⎝⎛fx000fy0cxcy1⎠⎞⎝⎛xyd⎠⎞=d1KP
为了好看没分母会这么写:
d(uv1)=KPd\begin{pmatrix} u \\ v \\ 1 \end{pmatrix}= KPd⎝⎛uv1⎠⎞=KP
那个K矩阵里面都是常数,相机出厂后这些参数就不会变了。所以这个矩阵叫做相机内参数矩阵
由于三维重建这个应用中,相机是运动的,而现在我们用的物体的坐标是物体相对相机的坐标。为了统一坐标系,一般会设置一个世界坐标系。那么需要一个变换把物的在世界坐标变换到相机坐标。这个变换包含旋转与平移变换,一般乘上个齐次变换矩阵T就可以了。相机坐标变换模型变成了
d(uv1)=K(TPw)d\begin{pmatrix} u \\ v \\ 1 \end{pmatrix}= K(TP_w)d⎝⎛uv1⎠⎞=K(TPw),其中PwP_wPw是物体在世界坐标下的坐标。这个变换矩阵T叫做相机的外参数,其实它就是相机移动的轨迹。
图像畸变变形矫正
正常的小孔成像是不会产生畸变的,但是为了增强光线相机都使用了透镜。这就会使得照片发生畸变。由于这种透镜引起的畸变是对称的所以叫做径向畸变。它分为两种一种是桶形畸变后视镜和鹰眼看到那种,还有一种是枕形畸变向内缩。同时相机组装过程由于不能使得透镜与成像面完全平行,也会产生畸变,这个畸变叫做切向畸变。
径向畸变矫正原理,因为这是因为透镜所造成。所以越远离中心点需要矫正的越大。所以矫正的量要与像素点离中心点距离r呈正比。那为何要设计三个矫正参数k1,k2,k3。当畸变小的时候那就只让k1起作用,较大那就k3起作用。当然到底取多少那得算出来,一般用棋盘格标定然后算出畸变参数。
切向畸变矫正(???这个地方我不大懂):
Xcorrected=x+2p1xy+p2(r2+2x2)Ycorrected=y+2p2xy+p1(r2+2y2)X_{corrected}=x+2p_1xy+p_2(r^2+2x^2) \\ Y_{corrected}=y+2p_2xy+p_1(r^2+2y^2)Xcorrected=x+2p1xy+p2(r2+2x2)Ycorrected=y+2p2xy+p1(r2+2y2)
针孔相机模型成像原理与图像变形矫正教程相关推荐
- camera ---(6)双摄成像原理
1. 双camera 成像 为了下面的计算方便,首先在这里介绍一个凸透镜成像的简单性质. 内容 如图为摄像头成像的原理图,其中A为物点,O为光心,A'为像点,F,F'分别为物方和像方焦点. 该引理的内 ...
- 双摄像头立体成像(一)-成像原理
刚刚拿到毕设题目,基于双摄像头的3D-Reconstruction.毕竟是毕设,先不论难易与否,还是毕业最重要.所以数字图像处理的学习博客暂时告一段落,恰巧前些天由于身体原因好长时间没有更新,停了这么 ...
- 《Kinect应用开发实战:用最自然的方式与机器对话》一3.4 深度图像成像原理...
3.4 深度图像成像原理 Kinect有发射.捕捉.计算视觉重现的类似过程.严格说来,Kinect的"深度眼睛"是由一个红外投影机和红外摄像头组合而成的,投影和接收互为重叠,如图3 ...
- 图像成像原理与相机标定
一.图像成像原理 世界坐标系到相机坐标系 世界坐标系是空间中根据需求任意指定的坐标系,相机坐标系是以镜头为原点,光心方向为Z轴方向的坐标系. 同一个点在不同坐标系下的坐标可以通过平移旋转的仿射变换得到 ...
- 视觉SLAM——针孔相机模型 相机标定原理 双目相机模型 深度相机对比
前言 本博客为主要学习<视觉SLAM十四讲>第5讲.<机器人学的状态估计>第6章6.4.1透视相机.<多视图几何>第5章摄像头模型等SLAM内容的总结与整理. 主要 ...
- 单目相机成像模型——针孔相机模型
高翔:SLAM十二讲阅读笔记 本节主要注意四个坐标:世界,相机,归一化相机,像素. 针孔相机模型 相机坐标转换成像素坐标,由内参数矩阵决定. 相机位姿决定世界坐标转换成相机坐标:即外参数矩阵 内参数矩 ...
- 【自动驾驶】16.计算机视觉:相机成像原理:世界坐标系、相机坐标系、图像坐标系、像素坐标系之间的转换
本篇博客为转载,我对其中的细节添加了一些说明. 原文链接:https://blog.csdn.net/chentravelling/article/details/53558096 0.前言 最近整理 ...
- 计算机视觉:相机成像原理:世界坐标系、相机坐标系、图像坐标系、像素坐标系之间的转换(转载)
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/chentravelling/article/details/53558096 0.前言 最近整理了& ...
- 线性插值改变图像尺寸_数码相机的成像原理、显示屏尺寸、像素的介绍
阅读本文前,请您先点击上面的"蓝色字体",再点击"关注",这样您就可以继续免费收到文章了.每天都会有分享,都是免费订阅,请您放心关注. 注:本文转载自网络,不代 ...
- 【图像原理】rgb数字图片概念之显示器成像原理
数字图片概念之显示器成像原理 目录 数字图片概念之显示器成像原理 abstract 什么是DPI 什么是分辨率 电脑如何显示颜色画面 总结 abstract 本文主要介绍在计算机对数字图像进行处理与储 ...
最新文章
- Objective-C使用位运算设计可复选的枚举
- neo4j 查询同一节点的两个上级_WhatRoute for Mac(互联网流量诊断查询工具)
- Android Graphviz 安装
- 基于OMAPL138 + Xilinx spartan6的电力数据采集与传输设计
- Python 最好用的8个VS Code扩展
- Matlab中imhist的用法
- c 使用mysql的语句_在 MySQL 数据库中使用C 履行SQL的语句
- vue的jsx写法记录
- WARN : org.springframework.web.servlet.PageNotFound - No mapping found for HTTP request with URI [/J
- 毕设经典-人事档案管理系统(layer+SSM)-AOP介绍
- Stream系列(十二) PartitioningBy方法使用
- thinkphp创建临时表
- 关于.Net与J2EE的比较,到底用微软平台还是Java平台的问题
- vue2.0+ axios如何读取本地json文件的数据
- 王小云数学与计算机奖,2019未来科学大奖揭晓, 清华大学、山东大学教授王小云获“数学与计算机科学”奖...
- HDU1234 开门人和关门人
- 自制Kindle电子书转化的实用技巧
- 一个啃b站俄语教程的坚强日记
- 基于51单片机的智能垃圾桶
- 【重装系统】Win11预装 office 2021