在项目中,偶尔会遇到由于产品形状、拍摄位置等原因导致标定板很难放置的情况,此时可以考虑使用halcon自标定算法来标定相机。由于自标定可以在不使用用标定板情况下,进行畸变矫正。 此算子不能矫正焦距和比例因子,因此不能用于3D测量中。 参数: Image:输入图像 Region :矫正图像的区域 ImageRectified :矫正图像 CamParamIn:输入相机参数 CamParamOut :输出相机参数 ---- 3. 使用radial_distortion_self_calibration算子进行自标定, 得到相机内参以及用于标定的直线段 ? 所以,相机标定后的应用,会在后续的测量篇以及手眼标定篇涉及,请持续关注。 ----
相机标定 标定的目的:使相机的畸变最小化 参考:https://blog.csdn.net/sunshine_in_moon/article/details/45438547 通过相机的参数,确定2d (uv坐标系)到3d(xyz坐标系)映射函数 opencv有相应的标定函数,需要对特定图片进行标定 3d reconstruction library openmvg图像到稀疏点云 https://github.com
OpenCv相机标定——圆形标定板标定 0.前言 1.标定图案 2.OpenCv标定 3.标定结果分析 0.前言 OpenCv中,相机标定所使用的标定图案分为棋盘格、对称圆形及非对称圆形特征图、ArUco 省略部分可参考:OpenCv/sources/samples/cpp/tutorial_code/calib3d/camera_calibration/camera_calibration.cpp. //此处省略... } static void calcChessboardCorners(Size boardSize, float squareSize, vector<Point3f 文件,本代码读取的VID25X25_CircleGrid.xml文件内容见图3。 (OpenCv标定过程中采用了5项畸变系数k1,k2,p1,p2,k3;Halcon标定中只考虑径向畸变k,表中没有列出) 需要指出的是,实验数据来源于对同一组图片的标定。
程序中所用标准标定板。 一、图片预处理 使用的图片原像素是3072*2048,即600万像素,处理起来不快;改成了560*420,即20万像素。 \n"; //以下是摄像机标定 qDebug() << "开始标定………………"; /*棋盘三维信息 mm*/ cv::Size2f squareSize ; /* 保存标定板上角点的三维坐标 */ </std::vector /*内外参数*/ cv::Mat cameraMatrix = cv::Mat(3,3,CV_32FC1 每幅图像中角点的数量 cv::Mat distCoeffs = cv::Mat(1,5,CV_32FC1,cv::Scalar::all(0)); /* 摄像机的5个畸变系数:k1,k2,p1,p2,k3 for (j=0;j <boardSize.width;j++){< span> </boardSize.width;j++){<> cv::Point3f
世界转相机 R为3 x 3 旋转矩阵, t为3 x 1平移向量. 相机标定 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/140339.html原文链接:https://javaforall.cn
分为以下内容: 相机标定的目的和意义 相机成像过程的简化与建模 针孔相机模型的数学描述 标定针孔相机模型的参数 相机标定的目的和意义 我们所处的世界是三维的,而照片是二维的,这样我们可以把相机认为是一个函数 标定板的第二大作用是把标定板中的角点变换到相机坐标系下的坐标 。对于标定的初学者来说,很容易忽略的一点是标定板是具有标定板坐标系的。 换句话说,标定板中的每个角点,在标定板坐标系下的位置是确定并且是已知的。 而标定板坐标系变换到相机坐标系的变换矩阵,我们称它的元素为外参数,所以在我眼中,相机标定的外参根本就是标定内参的副产品,它会随着标定板的摆放不同而不同,由标定板坐标系变换到相机坐标系的变换矩阵可以由下式表达 如果用OpenCV或Matlab标定工具箱进行标定,需要给出棋盘格的物理尺寸,这其实就是在建立标定板坐标系,从测量的角度讲,标定板的精度是相机标定精度的基准,是误差传递链上的第一个环节。
相机标定是进行视觉测量和定位的基础工作之一,标定参数准确与否直接关系到整个系统的精度,为此根据自己项目中的经验及参考相关的商用视觉软件的做法将相机标定过程中标定图片的获取过程中需要注意的问题总结如下: 标定板拍摄的张数要能覆盖整个测量空间及整个测量视场,把相机图像分成四个象限(如图1所示),应保证拍摄的标定板图像均匀分布在四个象限中,且在每个象限中建议进行不同方向的两次倾斜,图2是一组推荐摆放方式图片 标定图片的数量通常在15~25张之间,图像数量太少,容易导致标定参数不准确。 圆或者圆环特征的像素数尽量大于20,标定板的成像尺寸应大致占整幅画面的1/4 用辅助光源对标定板进行打光,保证标定板的亮度足够且均匀 标定板成像不能过爆,过爆会导致特征轮廓的提取的偏移,从而导致圆心提取不准确 标定板特征成像不能出现明显的离焦距,出现离焦时可通过调整调整标定板的距离、光圈的大小和像距(对于定焦镜头,通常说的调焦就是指调整像距)。 标定过程,相机的光圈、焦距不能发生改变,改变需要重新标定。
综合考虑调试难度、标定精度等因素,9点法标定是工业上使用广泛的二维手眼标定,常用于从固定平面抓取对象进行装配等工业应用场景。 2 相关坐标系 手眼标定的熟练使用必须理解所涉及到的各个坐标系。 ? 图像坐标系 相机坐标系 标定板坐标系 ? 工具坐标系 机械手基础坐标系 ? 3 标定原理 通常眼在手上,相机拍照与标定的位置时一样的,那么眼在手上和手眼分离的标定过程都是一样的。 如果我们想求这【a-f】 6个变量需要有6个方程,也就是3组点。但是比三个点多呢? 比如:20个点。那就是用最小方差。 ? 3 标定步骤 准备一块标定板。 相机位置,机械手位置全部固定好,标定针固定在机械手上,固定好后不能够再移动。标定针的位置一定要与夹手或吸盘之内的工具同一位置高度。
概述 标定的目的,是求解相机与机械臂基座(或末端)之间固定的变换关系,是视觉引导机器人作业的基石,精准的标定是解决误差的前提。 ⑧ 评估误差 检查重投影误差,量化标定质量。 不评估则无法知晓精度。 ⑨ 最终验证 将标定结果写入系统,让机械臂指向一个固定物理点,对比理论位置与实际位置。 理论必须经实际场景验证。 3. 可以将机械臂、相机、标定物回归到标定时的初始状态,进行一次快速验证,确认是否有物理位移。 数据采集不当: 运动不充分:机械臂只做了小范围平移,没有充分改变标定板的俯仰、偏航、滚转角度。 错误/不精确的相机内参:手眼标定极度依赖精确的相机内参(焦距、主点、畸变系数)。务必先对相机进行高精度的单目标定,并应用去畸变后再进行手眼标定。 严谨标定: 使用Charuco板。 确保相机已完成单目标定,内参已知。 控制机械臂带动标定板,在相机视野内进行至少20组大幅度的、不同方向的平动和旋转。
使用软件:Halcon18.05(默认安装好任一版halcon) 使用设备:Intel Realsense 435+AUBO机械臂 完成功能:相机标定、eye-in-hand手眼标定 1.准备标定板 MarkDist(单位为米) caltab.descr是标定板描述文件 caltab.ps为标定板生成文件,没有ps用Adobe PDF打开就能看到如下图1-2所示的标定板,可以直接打印。 ,运行,在刚刚的保存路径下找到生成的caltab.descr 1.2有标定板 按照已有标定板尺寸生成caltab.descr——标定板描述文件,之后操作与1.1.2相同 2.相机标定 助手–打开新的Calibration 在结果中摄像机参数需要记录下来,之后会用到,摄像机位姿需要点击“保存”保存成 .dat 格式的文件 3.手眼标定 标定板不动,移动机械臂,拍摄15+张图片,覆盖多个位姿,并记录每张图片拍摄时机械臂的位姿 )的位置 ImageNameStart := '3d_machine_vision/923-0/0000' 改成自己的标定板描述文件位置 CalTabFile := 'C:/Users/alw/Desktop
一、确定性误差公式 我们将第一节给出的IMU确定性误差直接拿过来,轴偏角公式如下: 尺度因子: 零偏: 二、工具标定 这里我们使用开源的imu_tk进行标定,下载:https 2.1 代码细节 轴偏角、尺度因子、零偏变量如下: /** @brief Misalignment matrix */ Eigen::Matrix< _T, 3 , 3> mis_mat_; 3> ms_mat_; 首先,进行加速度计的标定:设重力加速度g_mag_(9.81),默认前后两帧加速度计三轴加速度分量相等,我们建立如下的残差方程,直接进行迭代优化即可得到加速度计的参数; /test_imu_calib data/imu.txt data/imu_temperature.txt 加速度计的标定结果: ? 陀螺仪的标定结果: ? 温漂标定结果: ? 至此,IMU的整个标定已经完成,下一期我们开始单目及双目摄像头的标定。
二、工具标定 这里我们使用开源的imu_utils进行标定,读者可以从github直接git clone。 ( _paramt[0] ); T _N = T( _paramt[1] ); T _B = T( _paramt[2] ); T _K = T( _paramt[3] 生成的bmx160.yaml文件在imu_utils/data下,打开yaml文件我们可以看到陀螺仪与加速度计的三轴噪声以及随机游走,至此标定完成。 ? IMU标定系列文章 1. IMU标定(一) Python高性能系列文章 Python高性能计算之列表 Python高性能计算之字典 Python高性能计算之堆 欢迎关注微信公众号:Quant_Times
旋转矩阵的Rodrigues形式表示 3. 立体校准和匹配 有了标定参数,校准的过程就很简单了。 实际距离的测量 在用cvFindStereoCorrespondenceBM得出disparity map之后,还需要通过cvReprojectImageTo3D这个函数将单通道Disparity Map 4.1 距离转换公式 但是在实际操作过程中,用cvReprojectImageTo3D得到的数据并未如实际所想,生成深度矩阵所定义的世界坐标系我就一直没弄清楚。 64-mind-1)*256=1163, 基本是对的, 后面一项修正值在通常情况下可以忽略 目前我还是不是很清楚立体坐标系原点和尺度,但是从这三个点的z坐标可以大致看出这三个物体的距离差大概是1:2:3, 通过ReprojectTo3D那个函数得到的三维坐标又是以哪个点为原点,那三个方向为x,y,z轴的?
矫正径向畸变前后的坐标关系为: x_c=x(1+k_1r^2+k_2r^4+k_3r^6) y_c=y(1+k_1r^2+k_2r^4+k_3r^6) 因此,为了矫正径向畸变,我们需要三个参数k_1,k _2,k_3。 理想图像坐标系->实际图像坐标系(考虑畸变) 由上文提到的透镜畸变的知识,我们一共需要5个畸变参数(k1、k2、k3、p1和p2 )来描述透镜畸变。 : u=u_0+\frac{x_c}{d_x},v=v_0+\frac{y_c}{d_y} 化为齐次坐标表示形式可得: 最后回到一整个流程(忽略透镜畸变): 棋盘 棋盘是一块由黑白方块间隔组成的标定板 ,我们用它来作为相机标定的标定物(从真实世界映射到数字图像内的对象)。
手眼标定最简单的方法:九点标定 九点标定的目的: 建立Mark点的图像坐标与其在机械手坐标系下的仿射变换矩阵,利用求得的仿射变换矩阵,可以把Mark点的图像坐标转成物理坐标,进而控制机械手完成定点抓取任务 halcon九点标定算子 %Mark点像素坐标 area_center(SortedRegions,Area,Row,Column) % Column_robot := [275,225,170,280,230,180,295,240,190
详细原理见[从零开始学习「张氏相机标定法」]: https://mp.weixin.qq.com/s/KuTRTPEgQ3oXBkQe11UgAA。 基于Kruppa的自标定法是通过二次曲线建立关于相机内参矩阵的约束方程,至少使用3对图像来标定相机。图像序列长度会影响标定算法的稳定性,无法保证射影空间中的无穷远平面。 程序如下: J = (checkerboard(300,3,4)>0.5); %生成黑白棋盘图像 figure, imshow(J) %显示黑白棋盘图像 imwrite(J,'plate.jpg'); 对于标定图像数量,位姿越多,标定结果也会越精确,建议在10到20幅之间。按照上图中的1、2、3进行相机标定操作。 1.添加标定图像后显示界面如下图: ? 2.相机标定后显示界面会显示相机与标定板之间的位置关系。 ? 3.相机参数输出 camera calibrator应用程序相机标定参数输出如图所示: ?
之前的文章调用了一堆opencv接口,但是从来没有涉及任何手眼标定的理论知识,这次聊一聊手眼标定的理论知识。 1、AX=XB推导 eye in hand,这种关系下,两次运动,机器人底座和标定板的关系始终不变。求解的量为相机和机器人末端坐标系的位姿关系。 这就是如雷贯耳的AX=XB等式。 ,相机改变姿态拍摄得到标定板的位姿,即是相机标定时的外参。 后续有机会也可以学习9点标定法等。这样就可以理解下面这张图了: 要注意的地方是:机械臂的欧拉角姿态要清楚欧拉角的顺序。 2.如何求解AX=XB? 可搜索关键字:经典手眼标定算法之Tsai-Lenz的OpenCV实现。 具体内容请听下回分解~
前言 计算机视觉中,相机标定的重要性不言而喻,前面在公众号【视觉IMAX】中写过有多篇文章是关于相机标定的,包括一分钟详解OpenCV之相机标定函数calibrateCamera(),从零开始学习「 张氏相机标定法」,但是,今天还想再次聊一聊相机标定,进一步加深对其基本方法与概念的理解。 Zhang方法标定步骤: (1)对一个pose,计算单应性矩阵; (2)有三个以上pose,根据各单应矩阵计算线性相机参数; (3)使用非线性优化方法计算非线性参数。 由于特征点在平面上,我们此处令Z=0,则有上图中的表达式,也可看出:单应矩阵H为3x3的矩阵。 那么如何求解单应矩阵,建立内参数方程呢? ? 注:由于Z=0,故而上图中r3一项没有,也即为0。 注:具体的详细步骤,可参考《Learning OpenCV3》。 第三步:求解外参数 ? 第四步(最后一步):非线性畸变参数求解 ?
【实例简介】 经典手眼标定算法matlab代码,程序作者为 Christian Wengert 。 工具箱包含的主要算法有Tsai-Lenz算法、NAVY算法(Park)、INRIA算法(Horaud)以及对偶四元数手眼定标算法 【实例截图】 【核心代码】 1cdffffa-57b3-468c-8073 ├── qmult.m ├── qnorm.m ├── refineGrid.m ├── sortHandEyeMovement.m └── TSAIleastSquareCalibration.m 3
Halcon标定助手逐步使用 1 Step: 打开标定助手。 ? 2 Step: 选择标定描述文件 方法一:此步骤可以点击描述文件右侧浏览图片选择halcon自带的描述文件。 ? 3.点击描述文件最右面靠近边框有个文件夹形状的图标,选择上述描述文件。 本篇选择标注助手30*30的标定描述文件。 ? 3 Step: 切换至标定标定,加载标定图像。 ? 需要注意的几点,标定板与采集的图片质量要好,相机采集标定图片需要至少10张,尽可能多覆盖多个方向,视野至少1//3。 本文加载官方自带标定图片后,如下图。 ? 方式二:图像源->图像采集助手。 警告级别选择70即可,移除最后一张“标定点提取失败”状态的图片。 ? 品质没有超过警告级别的70%都为正常的。 5 Step: 标定。 点击“标定”按钮,会自动切换到“结果”选项卡。 至此,标定完成。 ----