张正友标定Opencv实现、标定流程以及图像坐标转为世界坐标
使用相机以前,首先要进行相机标定,其原因是我们通过标定知道相机的内外参、得到内外参矩阵后可对相机拍摄的照片进行矫正,可以得到畸变较小的图像。而相机标定的输入就是相机所拍的多帧图片的角点坐标,以及标定板图像上所有角点的空间坐标(一般Z轴假设为Z=0)。相机标定后的输出就是相机的内外参数。
针对张正友标定相机的标定流程:1、获得多帧图片的角点坐标 2、获取标定板图像上所有角点的空间坐标 3、进行相机标定 4、对标定结果进行评价 5、再次利用标定板图像进行矫正 6、 图像坐标系转世界坐标系
1、获得多帧图片的角点坐标
对标定图片连续拍照,选择10-20帧图片,然后对其提取角点信息。(在此需要注意标定图片需要清晰)
提取图片角点选用的函数为:findChessboardCorners函数提取角点
findChessboardCorners函数原型:
- //! finds checkerboard pattern of the specified size in the image
- CV_EXPORTS_W bool findChessboardCorners( InputArray image, Size patternSize,
- OutputArray corners,
- int flags=CALIB_CB_ADAPTIVE_THRESH+CALIB_CB_NORMALIZE_IMAGE );
参数解析:①Image,传入拍摄的棋盘图Mat图像,必须是8位的灰度或者彩色图像;
②patternSize,每个棋盘图上内角点的行列数,一般情况下,行列数不要相同,便于后续标定程序识别标定板的方向;
③corners,用于存储检测到的内角点图像坐标位置,一般用元素是Point2f的向量来表示:vector<Point2f> image_points_buf;
④flags:用于定义棋盘图上内角点查找的不同处理方式,有默认值。
2、对每一帧图片进一步提取亚像素角点信息
为了提高标定精度,需要在初步提取的角点信息上进一步提取亚像素信息,降低相机标定偏差,常用的方法是cornerSubPix
cornerSubPix函数原型:
- CV_EXPORTS_W void cornerSubPix( InputArray image, InputOutputArray corners,
- Size winSize, Size zeroZone,
- TermCriteria criteria );
参数解析:①Image,传入拍摄的棋盘图Mat图像,最好是8位灰度图像,检测效率更高;
②corners,初始的角点坐标向量,同时作为亚像素坐标位置的输出,所以需要是浮点型数据,一般用元素是Pointf2f/Point2d的向量来表示:vector<Point2f/Point2d> imagePointsBuf
③winSize,大小为搜索窗口的一半;
④zeroZone,死区的一半尺寸,死区为不对搜索区的中央位置做求和运算的区域。它是用来避免自相关矩阵出现某些可能的奇异性。当值为(-1,-1)时表示没有死区;
⑤criteria,定义求角点的迭代过程的终止条件,可以为迭代次数和角点精度两者的组合;
3、获取标定板图像上所有角点的空间坐标(即物体的实际坐标)
以和步骤一相同的方法获取世界坐标系的三维坐标即objectPoints,其用向量来表示vector<vector<Point3f>> object_points
4、进行相机标定
获取到棋盘标定图的内角点图像坐标以及标定板图像的空间坐标之后,就可以使用calibrateCamera函数进行标定,计算相机内参和外参系数,
calibrateCamera函数原型:
- CV_EXPORTS_W double calibrateCamera( InputArrayOfArrays objectPoints,
- InputArrayOfArrays imagePoints,
- Size imageSize,
- CV_OUT InputOutputArray cameraMatrix,
- CV_OUT InputOutputArray distCoeffs,
- OutputArrayOfArrays rvecs, OutputArrayOfArrays tvecs,
- int flags=0, TermCriteria criteria = TermCriteria(
- TermCriteria::COUNT+TermCriteria::EPS, 30, DBL_EPSILON) );
参数解析:①objectPoints,为世界坐标系中的三维点。在使用时,应该输入一个三维坐标点的向量的向量,
即vector<vector<Point3f>> object_points。需要依据棋盘上单个黑白矩阵的大小,
计算出(初始化)每一个内角点的世界坐标;
②imagePoints,为每一个内角点对应的图像坐标点。和objectPoints一样,应该输入vector<vector<Point2f>> image_points_seq形式的变量;
③imageSize,为图像的像素尺寸大小,在计算相机的内参和畸变矩阵时需要使用到该参数;
④cameraMatrix为相机的内参矩阵。输入一个Mat cameraMatrix即可,如Mat cameraMatrix=Mat(3,3,CV_32FC1,Scalar::all(0));
⑤distCoeffs为畸变矩阵。输入一个Mat distCoeffs=Mat(1,5,CV_32FC1,Scalar::all(0));
⑥rvecs为旋转向量;应该输入一个Mat类型的vector,即vector<Mat>rvecs;
⑦tvecs为位移向量,和rvecs一样,应该为vector<Mat> tvecs;
⑧flags为标定时所采用的算法。有如下几个参数:
CV_CALIB_USE_INTRINSIC_GUESS:使用该参数时,在cameraMatrix矩阵中应该有fx,fy,u0,v0的估计值。否则的话,将初始化(u0,v0)图像的中心点,使用最小二乘估算出fx,fy。
CV_CALIB_FIX_PRINCIPAL_POINT:在进行优化时会固定光轴点。当CV_CALIB_USE_INTRINSIC_GUESS参数被设置,光轴点将保持在中心或者某个输入的值。
CV_CALIB_FIX_ASPECT_RATIO:固定fx/fy的比值,只将fy作为可变量,进行优化计算。当CV_CALIB_USE_INTRINSIC_GUESS没有被设置,fx和fy将会被忽略。只有fx/fy的比值在计算中会被用到。
CV_CALIB_ZERO_TANGENT_DIST:设定切向畸变参数(p1,p2)为零。
CV_CALIB_FIX_K1,…,CV_CALIB_FIX_K6:对应的径向畸变在优化中保持不变。
CV_CALIB_RATIONAL_MODEL:计算k4,k5,k6三个畸变参数。如果没有设置,则只计算其它5个畸变参数。
在使用该函数进行标定运算之前,需要对棋盘上每一个内角点的空间坐标系的位置坐标进行初始化,标定的结果是生成相机的内参矩阵cameraMatrix、相机的5个畸变系数distCoeffs,另外每张图像都会生成属于自己的平移向量和旋转向量。
5、对标定结果进行评价
对标定结果进行评价的方法是通过得到的摄像机内外参数,对空间的三维点进行重新投影计算,得到空间三维点在图像上新的投影点的坐标,计算投影坐标和亚像素角点坐标之间的偏差,偏差越小,标定结果越好。
对空间三维坐标点进行反向投影的函数是projectPoints,函数原型是:
- CV_EXPORTS_W void projectPoints( InputArray objectPoints,
- InputArray rvec, InputArray tvec,
- InputArray cameraMatrix, InputArray distCoeffs,
- OutputArray imagePoints,
- OutputArray jacobian=noArray(),
- double aspectRatio=0 );
参数解析:①objectPoints,为相机坐标系中的三维点坐标;
②rvec为旋转向量,每一张图像都有自己的选择向量;
③tvec为位移向量,每一张图像都有自己的平移向量;
④cameraMatrix为求得的相机的内参数矩阵;
⑤distCoeffs为相机的畸变矩阵;
⑥imagePoints为每一个内角点对应的图像上的坐标点;
⑦jacobian是雅可比行列式;
⑧aspectRatio是跟相机传感器的感光单元有关的可选参数,如果设置为非0,则函数默认感光单元的dx/dy是固定的,会依此对雅可比矩阵进行调整;
6、再次利用标定板图像进行矫正
利用求得的相机的内参和外参数据,可以对图像进行畸变的矫正,使用undistort函数实现。
undistort函数原型:
- CV_EXPORTS_W void undistort( InputArray src, OutputArray dst,
- InputArray cameraMatrix,
- InputArray distCoeffs,
- InputArray newCameraMatrix=noArray() );
参数解析:①src,输入参数,代表畸变的原始图像;
②dst,矫正后的输出图像,跟输入图像具有相同的类型和大小;
③cameraMatrix为之前求得的相机的内参矩阵;
④distCoeffs为之前求得的相机畸变矩阵;
⑤newCameraMatrix,默认跟cameraMatrix保持一致;
7、图像坐标系转世界坐标系
图像坐标系转为世界坐标系采用的是透视变换,由张正友标定法单应性矩阵,再通过透视变换原理便可得到世界坐标系。
参考大佬博客:张正友标定:
http://blog.csdn.net/dcrmg/article/details/52939318
透视变换原理可参考如下博客:
http://blog.csdn.net/guduruyu/article/details/72518340
http://www.taodudu.cc/news/show-1217169.html
相关文章:
- 畸变校正详解
- 双线性内插插值原理
- TX2刷机flashOS finished后,卡在determining IP address解决方案
- Jetson-TX2安装opencv教程
- Jetson TX2板载相机opencv调用打开
- 单独像对相对定向的部分基本概念
- 单独像对相对定向元素解析
- 模型点计算
- 连续法相对定向元素
- 绝对圆锥曲线
- aarch64(ARMv8)交叉编译环境下载
- 施密特正交化的几何解释
- 信赖域算法
- 最优化系列
- 向量和矩阵范数总结
- 矩阵的逆、伪逆、左右逆,最小二乘,投影矩阵
- 矩阵的四个基本子空间
- 对角化和A 的幂
- 选主元的高斯-约旦(Gauss-Jordan)消元法解线性方程组/求逆矩阵
- MSVCRTD.lib(crtexew.obj) : error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainC
- PCL1.8.0+Windows+VS2013配置
- 正规方程的推导过程
- (多变量线性回归)正规方程求解特征参数的推导过程
- 你应该要掌握的7种回归分析方法
- 目标识别、目标跟踪算法总结
- 牛顿法与拟牛顿法学习笔记
- 单双目相机畸变校正--极线校正
- 鱼眼图像畸变校正
- 鱼眼图像畸变校正--透视变换
- Levmar:VS2015编译Levmar及Demo示例
张正友标定Opencv实现、标定流程以及图像坐标转为世界坐标相关推荐
- 张正友相机标定程序实现
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/hongbin_xu/article/details/78988450 前言 在前面的博客中( 三维重 ...
- 张正友相机标定(全流程,含畸变,matlab源代码解析)
张正友标定的具体原理很多文章已经介绍,这里主要结合源代码对其中的基本原理及本人遇到的问题进行介绍.(仅介绍基本原理供本人复习,同时方便他人,如有问题,请及时指正勿喷) 1. 标定基本思路介绍 相机标定 ...
- 张正友相机标定Opencv实现以及标定流程标定结果评价图像矫正流程解析(附标定程序和棋盘图)
from:https://blog.csdn.net/dcrmg/article/details/52939318 使用Opencv实现张正友法相机标定之前,有几个问题事先要确认一下,那就是相机为什么 ...
- 张正友摄像机标定的研究(MATLAB+OpenCV)
张正友 本科浙大,本来以为是中国人论文是中文呢,哎 张正友的主页: http://research.microsoft.com/en-us/um/people/zhang/Calib/ 不过里面的棋盘 ...
- matlab张正友摄像机标定算法应用,张正友摄像机标定的研究(MATLAB+OpenCV)
张正友 本科浙大,本来以为是中国人论文是中文呢,哎 不过里面的棋盘格跟我的不一样啊,why???,我决定先看看中文的论文吧,我的首要任务是弄清楚输入输出,流程,怎么用吧 matlab 跟 opencv ...
- 标定学习笔记(三)-- 利用OpenCV实现张正友标定法
根据之前所总结的张正友标定方法的相关知识点,以及一些已有程序,利用OpenCV实现一下整体的标定过程,所用的资源我会进行上传. 资源连接:Zhang'sCameraCa ...
- OpenCV实现张正友相机标定源代码
本源代码基于VC++和opencv Opencv2.4.13.6版本开发,实现张正友相机标定源代码,资源包括完整源代码和12张棋盘图片,完美运行. Opencv2.4.13.6安装包下载地址:http ...
- 基于openCV库的张正友标定法的一些实验结果
超大畸变图像畸变校正的实验结果 前言 5 测试与评估 5.1 标靶图像校正测试 5.1.1 测试样例 5.1.2 输出参数 5.1.2 矫正结果显示 5.2 常规图像校正测试 5.2.1 测试样例 5 ...
- 张正友相机标定算法原理与源代码(OpenCV+C++)
摄像机的标定问题是机器视觉领域的入门问题,可以分为传统的摄像机定标方法和摄像机自定标方法.定标的方法有很多中常见的有:Tsai(传统)和张正友(介于传统和自定标)等, 摄像机成像模型和四个坐标系(通用 ...
最新文章
- ZeroCopyLiteralByteString cannot access superclass
- C++使用默认参数的构造函数
- go 使用mongodb
- 数据挖掘 —— 有监督学习(分类)
- 软件工程课堂作业(八)——结对开发(三)
- 【wpf WebBrowser 清空网站的CookieSession 清空用户登录状态】
- c语言转汇编语言 vs,C语言转换成汇编语言
- c语言变量为什么要定义,C语言为什么要规定对所用到的变量要“先定义,后使用”...
- 两个sql交集_简单明了的sql基础语句
- Servlet异步处理性能优化的过程
- linux下分割文件的方法,关于linux系统下分割大文件的方法
- 北海焊接机器人_东方自动焊接专机价格优惠
- java笔试题_一道简单的 Java 笔试题,但值得很多人反思
- Visual studio 2010 中文SP1 无法安装Silverlight5 Beta Tools的解决办法
- APUE---chap6系统数据文件和信息---6.2~6.4 6.10
- 在百度上搜不到的资源是在哪找的?就在这些强大的资源搜索网站呀
- Redhat 国内Yum源配置
- 机器人正向运动学和D-H参数方法
- 阿尔泰数据采集卡模拟量采集演示
- 享受科技,抓住先“机”,苏宁手机蜜蜂节各大手机新品在等你
热门文章
- 容器编排技术 -- Kubernetes 在 Namespace 中配置默认的CPU请求与限额
- 数据可视化组件Grafana详细解读--RedHat/Fedora/CentOS/Oracle上的安装
- BGP——重分发注意点(总结+配置)
- 解决后台json数据返回的字段需要替换的问题
- 移动Web开发基础概念
- cloudflare 利用API将域名批量解析到cloudflare
- 【Python】实现输出成绩最高或最低分的学生姓名以及低于平均分的学生姓名
- 如何遍历JavaScript中的对象
- soap rest_REST是新的SOAP
- 132_Power BI之建模必备要素Power Query之数据表字段名称管理