zoukankan      html  css  js  c++  java
  • 针孔相机模型成像原理与图像变形矫正教程

    相机成像原理与焦距概念

    针孔相机的本质就是初中学过的小孔成像,镜头是一个小孔,然后光线透过小孔被感光传感器所捕获。当然以前的相机是通过胶片来捕获光线。虽然各个时代的相机记录图像的技术不一样,但是不变的都是利用小孔成像这个原理来将外面的三维的大图像缩小到一个二维的小照片上。相信你不会对下面这个图陌生,比较初中物理书上必备这个。
    在这里插入图片描述
    真实图像各个像素点的位置与照片里面的图像的位置对应关系是由下面这个红色的相似三角形所决定。
    在这里插入图片描述
    相机里面那个小三角形的直角边叫做焦距,经常听到的调焦距对焦就弄的是这个恰当的焦距才能更好的成像。
    在这里插入图片描述
    现在有个问题了,它是倒立的像,而我们平常看到的照片很正常。这是因为相机自动给我们翻转了图像,最古老的相机它拍照的时候是倒过来的。接下来定量的分析照片上的点与实际图像点之间的长度关系。

    针孔相机数学模型

    在这里插入图片描述
    从这个相似三角形我们可以看到实际物体坐标与它们在相机中的坐标对应关系。注意:物体的坐标是三维,但是照片上的坐标只有2维。x=f(xd)x'=-f*(frac x d),之所以有个负号是因为他们是倒立的,所以坐标的符号发生变化。由于我们平常接触到的照片并不是倒立的所以照片上的坐标计算公式为x=f(xd)x'=f*(frac x d)。不同相机的焦距f是不一样的,所以这个参数叫做相机的内参。它对于我们根据照片来三维重建原先的物体非常重要。这个相机的内参一般厂家会提供,如果没有那就得我们自己用相机对标定板拍照,然后根据照片来计算出相机的焦距。

    我们平常有用的坐标系都是长这样的:
    在这里插入图片描述
    但是在计算机图像图形领域用的坐标系是长这样的,坐标系原点在相片的左上角:
    在这里插入图片描述
    我们之前写的x=f(xd)x'=-f*(frac x d)这个公式,它坐标系原点是和焦点在同一条线上即相片的中心。但是我们存储相片的时候用的坐标系却是计算机图像坐标系。所以我们得把针孔模型的坐标变换到计算机图像坐标系中。这个其实非常简单,因为本质上就是把整个坐标系进行了平移,和翻转了一下。假设原先针孔相机模型的各像素的坐标是[x’,y’],而存储的计算机图像坐标系坐标为[u,v]。
    他们之间的对应关系就是平移了一下,翻转了一下。用公式表示就是:u=ax+cx,v=by+cyu=ax'+c_x,v=by'+c_y。然后把x=f(xd)x'=f*(frac x d)代入得到u=a×f×(xd)+cx,v=b×f×(yd)+cyu=a×f×(frac x d)+c_x,v=b×f×(frac y d)+c_y,我们把x,y前面的系数合并为u=fx×(xd)+cx,v=fy×(yd)+cyu=f_x×(frac x d)+c_x,v=f_y×(frac y d)+c_y
    在计算机里面喜欢用矩阵来存储公式。上面那个变换公式可以写成矩阵形式(用的是齐次坐标):
    (uv1)=1d(fx0cx0fycy001)(xyd)=1dKPegin{pmatrix} u \ v \ 1 end{pmatrix}=frac 1 {d} egin{pmatrix} f_x & 0 & c_x \ 0 & f_y & c_y \ 0 & 0 & 1 end{pmatrix}egin{pmatrix} x \ y \ d end{pmatrix}=frac 1 {d} KP
    为了好看没分母会这么写:
    d(uv1)=KPdegin{pmatrix} u \ v \ 1 end{pmatrix}= KP
    那个K矩阵里面都是常数,相机出厂后这些参数就不会变了。所以这个矩阵叫做相机内参数矩阵
    由于三维重建这个应用中,相机是运动的,而现在我们用的物体的坐标是物体相对相机的坐标。为了统一坐标系,一般会设置一个世界坐标系。那么需要一个变换把物的在世界坐标变换到相机坐标。这个变换包含旋转与平移变换,一般乘上个齐次变换矩阵T就可以了。相机坐标变换模型变成了
    d(uv1)=K(TPw)degin{pmatrix} u \ v \ 1 end{pmatrix}= K(TP_w),其中PwP_w是物体在世界坐标下的坐标。这个变换矩阵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)

    知乎 https://www.zhihu.com/people/yuanmuou/activities
  • 相关阅读:
    [labuladong算法小抄]如何判断回文链表
    [PHP]json_encode中文JSON_UNESCAPED_UNICODE在php5.3返回null
    [javascript] 使用javascript实现webrtc视频聊天demo
    [Linux] grep查找文本时反斜杠转义问题
    [css] 使用css画文件夹icon和话筒icon
    [Go] 开源客服系统以及多商户客服系统-GOFLY在线客服
    [javascript] vue和elementui中的键盘事件
    Elasticsearch 学习之不停止服务,完成升级重启维护操作
    unassigned_shards一直无法分配
    Jenkins+Gradle实现打包时自定义项
  • 原文地址:https://www.cnblogs.com/ailitao/p/11047264.html
Copyright © 2011-2022 走看看