一 摄像机成像模型

成像的过程实质上是几个坐标系的转换。首先空间中的一点由世界坐标系转换到摄像机坐标系,然后再将其投影到成像平面(摄像机的CCD),最后再将成像平面上的数据转换到图像平面(最后生成的图像)。

图1-1

世界空间内的一个点在图像上成像的过程称为投影成像过程,这中间转换过程构成的矩阵M称为投影矩阵。

摄像机的畸变参数与相机成像时采用的分辨率无关,而fx,fy和光心位置cx,cy与分辨率有关,但是成倍数关系,例如在分辨率320×240分辨率标定得到内参数为fx0,fy0,cx0,cy0,那么在分辨率640×480下对应的参数则为2fx0,2fy0,2cx0,2cy0。

上面这些参数中,f,t所采用的量纲都是mm,而dx和dy指的是每个像素个数的大小,即mm/pixel,那么经过换算最后得到的u、v的量纲自然也就是像素。fx和fy是由f/dx,f/dy计算而来,表示的是长度值为f时对应的像素个数,也即长度值为f(mm)时,在图像平面的x方向和y方向的像素个数,fx、fy、u0、v0构成A,A右边的数据为[R|t]M’,看起来[R|t]M’对应的数据的量纲好像是mm,因为M’和t的量纲都是mm,这样A里面的量纲又为像素,这样乘起来的量纲就是mm*pixel了,这显然不对。但是事实情况并不是真的这样,最后[R|t]M’与A相乘的时候,[R|t]M’的结果是需要进行归一化的,即[xc

yc zc 1] →[xc/zc yc/zc 1],这个时候它的量纲其实就只是倍数了。整个过程如下图

图 1-2

OpenCV标定出来的内参数矩阵一般为(分辨率为640×480)

3

3

d

5.3193633829444082e+002 0. 3.1950000000000000e+002 0.

5.3193633829444082e+002 2.3950000000000000e+002 0. 0. 1.

这里的fx≈531.9,fy≈531.9,u0=319.5,v0=239.5。u0和v0比较好理解,差不多就是图像的中心,但是这里的fx和fy为500多还是有点抽象,虽然前面已经说了表示焦距长度对应的像素个数。根据上图中u和v的计算公式,还有标定的内参矩阵值,其实可以反推出x’、y’的大致大小,这里u的最大值是640,v的最大值为480,用这些值可以算出x’和y’的最大值分别为0.6025和0.4521,它们分别代表经过Z值归一化后的比例值,这个值实质上反映了相机的视角。

二 成像畸变

在没有畸变的情况下,理想的成像的过程是如图1-2所示

但是在实际的情况中,真正的镜头通常有一些形变,主要的变形为径向形变,也会有轻微的切向形变。所以上面的模型需要扩展为:

图2-1

k1和k2是径向形变系数,p1和p2是切向形变系数。OpenCV中没有考虑高阶系数。形变系数跟拍摄的场景无关,因此它们是内参数,而且与拍摄图像的分辨率无关。参见opencv中文wiki

opencv计算得到的畸变参数形式为:

5

1

d

6.7442695842244271e-002 2.4180872220967919e-001 0. 0.

-3.3970575589699975e-001

对应存放的畸变参数为[k1,k2,p1,p2[,k3[,k4,k5,k6]]

三 畸变校正

根据前面的说明,可以知道摄像机拍下来的图片是存在畸变的,现在需要根据内参矩阵和畸变参数对存在畸变的图像进行校正。校正的过程就是就是图2-1描述的过程。

首先是根据拍摄得到的存在畸变图像的坐标,计算出根据畸变模型得到的校正图像对应的坐标,这样就建立了畸变图像坐标和校正图像坐标之间的映射关系。同时计算出来的校正坐标存在小数,所以就需要对其插值。

例如XYsrc(1,1)XYrect(1.5,1.0),那么假如采用简单的线性插值的话,Irect(1.5,1.0)=[Isrc(1,1)+Isrc(2,1)]*0.5

Irect就是算出来的校正后的像素值。

进行畸变的matlab校正代码(参见stackoverflow)如下:

clear;

clc;

A =[5.9418398977142772e+002 0 3.1950000000000000e+002;

0    5.941839897714e+002 2.3950000000000000e+002;

0 0 1];

D = [6.7442695842244271e-002 2.4180872220967919e-001 0 0 -3.3970575589699975e-001];

fx = A(1,1);

fy = A(2,2);

cx = A(1,3);

cy = A(2,3);

k1 = D(1);

k2 = D(2);

k3 = D(5);

p1 = D(3);

p2 = D(4);

K = A;

Idistorted = imread('logi.jpg');

Idistorted = rgb2gray(Idistorted);

Idistorted = im2double(Idistorted);

I = zeros(size(Idistorted));

[i j] = find(~isnan(I));

% Xp = the xyz vals of points on the z plane

Xp = inv(K)*[j i ones(length(i),1)]';

% Now we calculate how those points distort i.e forward map them through the distortion

r2 = Xp(1,:).^2+Xp(2,:).^2;

x = Xp(1,:);

y = Xp(2,:);

x = x.*(1+k1*r2 + k2*r2.^2) + 2*p1.*x.*y + p2*(r2 + 2*x.^2);

y = y.*(1+k1*r2 + k2*r2.^2) + 2*p2.*x.*y + p1*(r2 + 2*y.^2);

% u and v are now the distorted cooridnates

u = reshape(fx*x + cx,size(I));

v = reshape(fy*y + cy,size(I));

% Now we perform a backward mapping in order to undistort the warped image coordinates

I = interp2(Idistorted, u, v);

subplot(121); imagesc(Idistorted);

subplot(122); imagesc(I);

得到的结果图为:

unity 畸变_摄像机成像、畸变模型相关推荐

  1. 【计算机视觉】opencv姿态解算7 四大坐标系,摄像机线性模型, 畸变模型

    转载 http://blog.csdn.net/tiemaxiaosu/article/details/51725240 1 坐标系统 四大坐标系 一.成像坐标 (1).图像坐标系(Pixel coo ...

  2. 【自动驾驶】27.相机畸变_相机内参标定 整理

    本文整理了很多有关相机畸变博客的相关内容,都附上的原文地址,也纠正了一些其他博客的错误. 下面两张截图来自高翔博士的<视觉SLAM十四讲>书中内容. 有关添加畸变矫正以及去畸变的详细过程, ...

  3. 摄像机投射投影模型_综述及详解

    1.写在前面的话 摄像机通过成像透镜将三维场景投影到摄像机二维像平面上,这个投影可以用成像变换进行表示,也就是我们平常说的摄像机投影模型.摄像机成像模型有不同的描述方式.这里仅仅总结了机器视觉中常用的 ...

  4. 读取摄像机的内参和畸变系数并对畸变图像进行去畸变

    这个程序的目标是读取摄像机的参数(内参和畸变系数),并对畸变图像进行去畸变操作,然后进行一些特征点和矩形框的绘制. #include 语句引入所需的库. using namespace std; 和 ...

  5. 《视觉SLAM十四讲》学习笔记-摄像机成像公式

    针孔相机模型 摄像机内外参数矩阵 内参数矩阵 外参数矩阵 畸变 径向畸变 切向畸变 双目相机模型 RGB-D模型 针孔相机模型 设P点坐标为 [X,Y,Z]⊤ [ X , Y , Z ] ⊤ [X, ...

  6. 几何畸变的类型_halcon图像畸变 论述遥感数字图像畸变类型及其产生的原因

    1, 论述遥感数字图像畸变类型及其产生的原因 1.畸变类型辐射失真:指遥感传感器在接收来自地物的电磁波辐射能时,电磁波在大气层中传输和传感器测量中受到遥感传感器本身特性.地物光照条件(地形影响和太阳高 ...

  7. 相机标定之畸变矫正与反畸变计算

    相机标定之畸变矫正与反畸变计算 相机标定问题已经是比较成熟的问题,OpenCV中提供了比较全面的标定.矫正等函数接口.但是如果我想通过一张矫正好的图像,想获得原始的畸变图,却没有比较好的方法,这里讨论 ...

  8. 数学建模_随机森林分类模型详解Python代码

    数学建模_随机森林分类模型详解Python代码 随机森林需要调整的参数有: (1) 决策树的个数 (2) 特征属性的个数 (3) 递归次数(即决策树的深度)''' from numpy import ...

  9. Unity之2D摄像机跟随

    Unity之2D摄像机跟随 在2D游戏制作过程中,摄像机的跟随主角移动是必不可少的.有代码实现,也有插件实现.下面分别讲述两种方法. Unity中提供了专属的摄像机插件进行使用: 官方Cinemach ...

最新文章

  1. HDU 1022[Train Problem I] 栈的应用
  2. 1200+标星,3千多人点赞,这本书让你系统了解机器学习可解释性丨开源免费阅读...
  3. 自己搭建个对象存储服务难不难?
  4. 线上课程推荐 | 计算机方向:无人驾驶中的环境感知
  5. 带Prometheus的Spring Boot和测微表第4部分:基础项目
  6. 信息学奥赛一本通(1107:校门外的树)
  7. 带锚点进度条android,Axure:实现可拖动进度条
  8. 从数据仓库到大数据平台再到数据中台(内附13张架构图)
  9. 微信机器人开发SDK使用教程--群发消息任务
  10. PurgeComm()函数--清空缓冲区
  11. 如何制作HTML网页设计【体育运动主题网站——中国篮球NBA】
  12. 局域网服务器共享不稳定怎么办,局域网计算机文件共享异常解决方案
  13. 近期14个“AI产品经理”职位JD推荐(覆盖北京、上海、深圳、成都、重庆、杭州)
  14. 【Python CLI】第三章 控制台输出
  15. Java设计模式:游戏中的角色和武器抽象设计
  16. MFC对话框部分区域的显示和隐藏功能的实现
  17. C++项目之演讲比赛模拟
  18. c语言程序设计图书管理,C语言程序设计报告 图书馆信息管理系统
  19. VS2019社区版--WDK-win10-2004开发环境搭建
  20. yii Yii Framework PHP 框架

热门文章

  1. python爬取百度学术文献搜索引擎_通用爬虫探索(一):适用一般网站的爬虫
  2. oracle函数isnull,SQL中的ISNULL函数使用介绍
  3. Unity3D UGUI实现翻书效果
  4. 金蝶云星空与金蝶云星空对接集成逐个单据查询连通审核单据(分步式调出单提交-审核)
  5. AES256-CBC加解密
  6. 女性职工生育保险报销规则--孕期囤货指南--北京生育津贴申请指南--北京生育保险报销条件材料及流程(门诊产检费)
  7. 根据一个含有服务器文件夹地址下载文件夹下的所有文件(其实需要知道所有文件名)
  8. 松耦合和紧耦合的架构设计及性能对比
  9. 扩展卡尔曼滤波(EKF)理论讲解与实例(matlab、python和C++代码)
  10. 服务器重启进不了系统