OpenCV 3.0.0处理鱼眼镜头信息 - Fisheye camera model
此篇随笔主要参考OpenCV 3.0.0的官方文档翻译而来,主要用作理解OpenCV对鱼眼相机的标定、图像校正、3D重建功能的理解。
版权所有,转载请注明出处~
xzrch@2018.09.29
参考链接:https://docs.opencv.org/3.0.0/db/d58/group__calib3d__fisheye.html#gad626a78de2b1dae7489e152a5a5a89e1
---------------------------------------------------------------------
Namespace
cv::fisheye
枚举类型
enum {
cv::fisheye::CALIB_USE_INTRINSIC_GUESS = ,
cv::fisheye::CALIB_RECOMPUTE_EXTRINSIC = ,
cv::fisheye::CALIB_CHECK_COND = ,
cv::fisheye::CALIB_FIX_SKEW = ,
cv::fisheye::CALIB_FIX_K1 = ,
cv::fisheye::CALIB_FIX_K2 = ,
cv::fisheye::CALIB_FIX_K3 = ,
cv::fisheye::CALIB_FIX_K4 = ,
cv::fisheye::CALIB_FIX_INTRINSIC =
}
函数
//执行相机标定
double cv::fisheye::calibrate (InputArrayOfArrays objectPoints, InputArrayOfArrays imagePoints, const Size &image_size, InputOutputArray K, InputOutputArray D, OutputArrayOfArrays rvecs, OutputArrayOfArrays tvecs, int flags=, TermCriteria criteria=TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, , DBL_EPSILON))
//使用鱼眼模型为2D点叠加畸变效果
void cv::fisheye::distortPoints (InputArray undistorted, OutputArray distorted, InputArray K, InputArray D, double alpha=)
//为去畸变和图像校正估计新的相机矩阵
void cv::fisheye::estimateNewCameraMatrixForUndistortRectify (InputArray K, InputArray D, const Size &image_size, InputArray R, OutputArray P, double balance=0.0, const Size &new_size=Size(), double fov_scale=1.0)
//通过cv::remap()计算去畸变和图像校正的映射,如果D为空,则使用零失真;如果R为空,则使用单位矩阵
void cv::fisheye::initUndistortRectifyMap (InputArray K, InputArray D, InputArray R, InputArray P, const cv::Size &size, int m1type, OutputArray map1, OutputArray map2)
//使用鱼眼模型映射点
void cv::fisheye::projectPoints (InputArray objectPoints, OutputArray imagePoints, const Affine3d &affine, InputArray K, InputArray D, double alpha=, OutputArray jacobian=noArray())
void cv::fisheye::projectPoints (InputArray objectPoints, OutputArray imagePoints, InputArray rvec, InputArray tvec, InputArray K, InputArray D, double alpha=, OutputArray jacobian=noArray())
//执行双目相机标定
double cv::fisheye::stereoCalibrate (InputArrayOfArrays objectPoints, InputArrayOfArrays imagePoints1, InputArrayOfArrays imagePoints2, InputOutputArray K1, InputOutputArray D1, InputOutputArray K2, InputOutputArray D2, Size imageSize, OutputArray R, OutputArray T, int flags=fisheye::CALIB_FIX_INTRINSIC, TermCriteria criteria=TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, , DBL_EPSILON))
//执行双目图像校正
void cv::fisheye::stereoRectify (InputArray K1, InputArray D1, InputArray K2, InputArray D2, const Size &imageSize, InputArray R, InputArray tvec, OutputArray R1, OutputArray R2, OutputArray P1, OutputArray P2, OutputArray Q, int flags, const Size &newImageSize=Size(), double balance=0.0, double fov_scale=1.0)
//变换图像以补偿鱼眼图像失真
void cv::fisheye::undistortImage (InputArray distorted, OutputArray undistorted, InputArray K, InputArray D, InputArray Knew=cv::noArray(), const Size &new_size=Size())
//使用鱼眼模型为2D点去畸变
void cv::fisheye::undistortPoints (InputArray distorted, OutputArray undistorted, InputArray K, InputArray D, InputArray R=noArray(), InputArray P=noArray())
详细描述
定义P为3D空间中的一个点,其在世界参考坐标系中的坐标向量为X。那么P点在相机参考坐标系中的坐标可以表示为:
Xc=RX+T
其中R是旋转向量,将此坐标的三个维度分别用x、y、z表示,则可知:
x=Xc1
P的小孔成像映射坐标为[a:b],其中:
a=x/z
b=y/z
r^2=a^2+b^2
θ=atan(r)
鱼眼相机的畸变为:
θd=θ(1+k1*θ^2+k2*θ^4+k3*θ^6+k4*θ^8)
考虑畸变后的点的坐标为:
x′=(θd/r)x
y′=(θd/r)y
最终,转换到像素域后,最终的像素点坐标[u,v]为:
u=fx*(x′+αy′)+c*x
v=fy*yy+c*y(此处好像有问题)
枚举类型文档
Enumerator | |
---|---|
CALIB_USE_INTRINSIC_GUESS | |
CALIB_RECOMPUTE_EXTRINSIC | |
CALIB_CHECK_COND | |
CALIB_FIX_SKEW | |
CALIB_FIX_K1 | |
CALIB_FIX_K2 | |
CALIB_FIX_K3 | |
CALIB_FIX_K4 | |
CALIB_FIX_INTRINSIC |
函数详细文档
objectPoints: 标定模式坐标空间中的标定模式点向量
imagePoints: 标定模式点的映射结果。对于每个i来说,imagePoints[i].size()与objectPoints[i].size()必须是一样大的。
image_size: 用于初始化相机内参矩阵的图像大小
K: 输出的3*3浮点相机矩阵A(包含fx、fy、cx、cy参数)。如果 fisheye::CALIB_USE_INTRINSIC_GUESS/ 被指定的话,这四个参数当中的所有或一部分需要被事先初始化。
D: 输出的相机畸变系数(k1,k2,k3,k4)
rvecs: 每个pattern view的旋转向量
tvecs: 每个pattern view的平移向量
flags: 不同的标志项代表不同的意义,可以为0或者以下值的若干组合
fisheye::CALIB_USE_INTRINSIC_GUESS :相机矩阵包含事先进一步优化的fx、fy、cx、cy的初始值。如果不选,则cx、cy会被初始化为图像正中心,并且以最小二乘的方式计算焦距。
fisheye::CALIB_RECOMPUTE_EXTRINSIC:每次优化迭代内参后,重新计算外参
fisheye::CALIB_CHECK_COND :函数将检查条件数和合法性
fisheye::CALIB_FIX_SKEW :偏差系数alpha会被置成0,并一直保持在0的状态
fisheye::CALIB_FIX_K1:选中的畸变系数会被置成0并一直保持在0的状态
criteria: 迭代优化算法的终止阈值
undistorted: 物点矩阵,2通道的1*N或N*1向量,或用vector<Point2f>表示。N是可见的点的数量。
distorted: 图像点的输出矩阵,2通道的1*N或N*1向量,或用vector<Point2f>表示。
K: 相机内参矩阵(包含fx、fy、cx、cy参数)
D: 相机畸变系数(k1,k2,k3,k4)
alpha: 偏差系数
K: 相机内参矩阵(包含fx、fy、cx、cy参数)
D: 相机畸变系数(k1,k2,k3,k4)
image_size:
R: 在物体空间的校正变换参数,1通道的3*3数值,或以vector形式表示: 1通道的3*1、1*3 或 3通道的 1*1
P: 新的相机矩阵(3*3)或新的映射矩阵(3*4)
balance: 在最大焦距值和最小焦距值范围之间设置新焦距值
new_size:
fov_scale: 新焦距的除数
K: 相机内参矩阵(包含fx、fy、cx、cy参数)
D: 相机畸变系数(k1,k2,k3,k4)
R: 在物体空间的校正变换参数,1通道的3*3数值,或以vector形式表示: 1通道的3*1、1*3 或 3通道的 1*1
P: 新的相机矩阵(3*3)或新的映射矩阵(3*4)
size: 无畸变的图像大小
m1type: map1的类型,可以是CV_32FC1或者CV_16SC2。
map1: 第一输出map
map2: 第二输出map
objectPoints: 物点向量,3通道的1*N或N*1向量,或用vector<Point3f>表示。N是可见的点的数量。
imagePoints: 像点向量,1通道的2*N/N*2或者2通道的1*N/N*1,或者vector<Point2f>
affine:
K: 相机内参矩阵(包含fx、fy、cx、cy参数)
D: 输入的相机畸变系数(k1,k2,k3,k4)
alpha: 偏差系数
jacobian: 可选的2N*15的雅克比输出矩阵,表示图像点相对于焦距的分量、主点的坐标、失真系数、旋转向量、平移向量、偏差系数等的导数。
objectPoints:
imagePoints1:
imagePoints2:
K1:
D1:
K2:
D2:
iamgeSize:
R:
T:
flags:
criteria;
K1:
D1:
K2:
D2:
imageSize:
R:
tvec:
R1:
R2:
P1:
P2:
Q:
flags:
newImageSize:
balance:
fov_scale:
distorted: 有鱼眼镜头畸变的图像
undistorted: 输出的鱼眼镜头畸变补偿后的图像
K: 相机内参矩阵(包含fx、fy、cx、cy参数)
D: 输入的相机畸变系数(k1,k2,k3,k4)
Knew: 失真图像的相机矩阵,默认情况下,它是单位矩阵,但可以使用其他矩阵来调整输出结果。
new_size: 该功能可以转换图像以补偿径向和切向镜头失真
说明:
这个函数只是简单的将fisheye::initUndistortRectifyMap 和 remap(使用双线性插值) 组合在一起使用。可以看如下的失真校正结果:
distorted: 物点矩阵,2通道的1*N或N*1向量,或用vector<Point2f>表示。N是可见的点的数量。
undistorted: 图像点的输出矩阵,2通道的1*N或N*1向量,或用vector<Point2f>表示。
K: 相机内参矩阵(包含fx、fy、cx、cy参数)
D: 输入的相机畸变系数(k1,k2,k3,k4)
R: 在物体空间的校正变换参数,1通道的3*3数值,或以vector形式表示: 1通道的3*1、1*3 或 3通道的 1*1
P: 新的相机矩阵(3*3)或新的映射矩阵(3*4)
OpenCV 3.0.0处理鱼眼镜头信息 - Fisheye camera model的更多相关文章
- 在Windows下编译扩展OpenCV 3.1.0 + opencv_contrib
为什么要CMake,这里我陈述自己的想法,作为一个刚使用opencv库的小白来说,有以下大概三点内容 1.由于在学习图像处理滤波器中,需要用到各种边缘保护滤波器(EPS)算法,但是这些算法在OpenC ...
- VS2013安装oepncv2.4.10 以及opencv 3.0.0
Author:Maddock Date:2014.12.27 …………………………………………………………………………………………………… PS: VS2013 + OPENCV 3.0.0 的安装, ...
- 【OpenCV】opencv3.0中的SVM训练 mnist 手写字体识别
前言: SVM(支持向量机)一种训练分类器的学习方法 mnist 是一个手写字体图像数据库,训练样本有60000个,测试样本有10000个 LibSVM 一个常用的SVM框架 OpenCV3.0 中的 ...
- Win7 OpenCV 3.0.0 VS2013 环境配置
参考资料:http://jingyan.baidu.com/article/75ab0bcbee4b47d6864db2fc.html 注: x86 x64 这些根据自己的系统以及需求而定, 这里就不 ...
- (win10 64位系统中)Visual Studio 2015+OpenCV 3.3.0环境搭建,100%成功
(win10 64位系统中)Visual Studio 2015+OpenCV 3.3.0环境搭建,100%成功 1.下载opencv 官网http://opencv.org/下载windows版Op ...
- Opencv 3.3.0 常用函数
如何调图像的亮度和对比度? //如何增加图片的对比度或亮度? void contrastOrBrightAdjust(InputArray &src,OutputArray &dst, ...
- 安装cmake 和 opencv 4.0.0
1.安装cmake3.5.1或更新的版本 安装gcc-c++:sudo apt-get install build-essential (或者直接执行这两条命令sudo apt-get install ...
- visual studio 2015 Opencv 3.4.0配置
因为想做AR方面,需要了解计算机视觉知识,决定从opencv开始入门,在网上买了本毛星云的<Opencv3编程入门>开始自学. 一.opencv 3.4.0下载安装 在官网http://o ...
- ubuntu卸载opencv并重装opencv3.0.0
一. 卸载opencv2.4.9: Going to the "build" folder directory of opencv from terminal, and execu ...
随机推荐
- CI框架源码研读(整体架构)
有人说phper的深入要从研读mvc框架开始,我跳了一个常用的CI框架入手,主要是因为 CI框架简单轻巧,可以自己DIY功能!!! 1.首先来看CI的整体架构图: 其中:application是用户级 ...
- Visual C++中MFC消息的分类
Visual C++中MFC消息的分为三类:标准(窗口)消息.命令消息.控件消息. 1.标准(窗口)消息:窗口消息一般与窗口内部运作有关,如创建窗口,绘制窗口,销毁窗口,通常,消息是从系统发到窗口,或 ...
- supervisord的配置
https://blog.csdn.net/xyang81/article/details/51555473 这位大佬写的很详细 你们可以去参考一下
- Office365学习笔记—获取当前用户
1,页面上有个_spPageContextInfo对象,可以获取一些我们需要的东西. (1)获取当前用户Id var userId=_spPageContextInfo.userId; (2)获取当前 ...
- Linux -- date 日期命令
Linux -- date 日期命令 date 用法:date [选项]... [+格式] 以给定的格式显示当前时间,或是设置系统日期. 1.使用 date 命令查看当前日期或当前时间 [root@l ...
- 解决Windows10下小娜无法搜索本地应用的问题
适用场景 小娜突然出现各种问题.比如突然无法搜索到本地应用...等其它问题 一般使用下面的方法,将小娜进行重新注册就ok了. 解决方案 1.用管理员权限打开 C:\Windows\System32\W ...
- MySQL必知必会 读书笔记三:检索数据和数据排序
检索数据 SELECT语句 它的用途是从一个或多个表中检索信息. 为了使用SELECT检索表数据,必须至少给出两条信息--想选择什 么,以及从什么地方选择. 检索单个列 SELECT col_1 FR ...
- 写shell脚本需要注意哪些地方----零基础必看
shell脚本是完全靠自学的,每一步需要注意的问题都是我自己亲自实践出来的,对于大神可能看来是小儿科,但是对于新手,是必须注意的 一.首先执行 echo $SHELL查看本机的解释器, 二.开始写脚本 ...
- 导入jar包和创建jar文件
具体步骤 导入jar包 1.在第一个工程中编写工具类并运行生成.class文件 2.在myeclipse工具栏找到open in 文件夹图标找到.class文件所在的包,将其全部复制到某个盘符下( ...
- 01-http简介-四层 七层 三次握手
HTTP简介.请求方法与响应状态码 接下来想系统的回顾一下TCP/IP协议族的相关东西,当然这些东西大部分是在大学的时候学过的,但是那句话,基础的东西还是要不时的回顾回顾的.接下来的几篇博客都是关于T ...