本次讲述一个halcon实例,如何对多个相机参数进行标定。
相机的标定流程一般由以下几个部分:
相机参数的初始化->读取标定文件->读取标定板图像->进行标定->标定结果。
1. 相机参数的初始化
在开始标定前,要把相机与镜头的基础参数告知系统,主要包括8个参数:
Focus:镜头的焦距, 单位是m
Kappa:径向畸变系数。
Sx:两个相邻像元工方向的距离。
Sy:两个相邻像元y方向的距离。
Cx:图像上主点的x坐标。
Cy,:图像上主点的y坐标„
ImageWidth:图像的宽度。
ImageHeight:图像的高度。
在halcon中,用gen_cam_par_area_scan_polynomial 算子对相机参数进行初始化设置。
2. 读取标定文件
读取的标定文件必须要和实际使用的标定板规格一致,否则标定结果不准确。
3. 读取标定板图像
在拍照获取标定板图像时,一定要注意下列情况,获取高质量的标定板图像时计算获得准确标定结果的基础。
->标定板不宜过小,至少要覆盖图像总面积的1/4;
->内部圆点的直径应该大于20个像素;
->标定板背景要暗,最好是黑色或接近黑色;
->打光时,标定板白色部分亮度要大于100,黑色与白色亮度差值大于100;
->光照亮度均匀,不能过曝光或欠曝光,即最高亮度低于255,最低亮度大于3;
->拍摄标定图像时,需要不同的旋转角度和倾斜角度,最好每个象限2张以上,标定图像至少10张,最好15~20张;
->标定板要涉及图像的各个区域(四个角以及中间)。
4.进行标定
标定板图像拍完以后,就可以进行标定了。标定之前要挑选一张图像作为参考图像, 参考图像中标定板的位置, 即为后续的世界坐标系和测量平面。 调用HALCON的算子对图像中的标定板进行识别, 识别前系统会先对图像进行高斯平滑, 然后将圆点中心和标定板的剪切角提取到图像上。 标定图像没有质量问题, 就可以根据获取到的标定点的数据进行标定计算。

实例如下:
1)参数设置:
dev_update_off ()
*标定板图像存储路径
ImgPath := ‘3d_machine_vision/multi_view/’
*标定板图像名称前缀
ImgPrefix := ‘multi_view_calib_’
*其中一张标定板图像所在路径+前缀+后缀(即路径+名称)
FileName := ImgPath + ImgPrefix + ‘cam_0_00’
*读取图像,获取图像大小
read_image (Image, FileName)
get_image_size (Image, Width, Height)
*比例因子设置
Scale := .5

2)标定信息
标定板信息,100100mm的标定板
CaltabDescr := ‘caltab_100mm.descr’
*标定板厚度,单位为m
CaltabThickness := 0.0064
*相机数量为4
NumCameras := 4
*标定任务数量位1
NumCalibObjects := 1
*标定板图像数量为20
NumPoses := 20
*光学系统/相机参数初始化
gen_cam_par_area_scan_polynomial (0.0085, 0.0, 0.0, 0.0, 0.0, 0.0, 6e-6, 6e-6, Width * .5, Height * .5, Width, Height, StartCamPar)

3)创建标定模型
*创建标定模型
create_calib_data (‘calibration_object’, NumCameras, NumCalibObjects, CalibDataID)
*设置初始化相机系统参数
set_calib_data_cam_param (CalibDataID, ‘all’, [], StartCamPar)
*设置标定板信息
set_calib_data_calib_object (CalibDataID, 0, CaltabDescr)

4)进行标定
*打开四个窗口,以显示由四个摄像头组成的多视图立体设置的图像
open_windows_multi_view_setup (Height, Width, Scale, WindowHandles)
*忽略的图像
NumIgnoredImg := 0
for PoseIndex := 0 to NumPoses - 1 by 1
for CameraIndex := 0 to NumCameras - 1 by 1
*第一张图像的路径+名称
FileName := ImgPath + ImgPrefix + ‘cam_’ + CameraIndex + ‘_’ + PoseIndex$‘02’
*读取图像
read_image (Image, FileName)
* 设置系统信息, 不强制刷新变动图像
set_system (‘flush_graphic’, ‘false’)
*激活窗口
dev_set_window (WindowHandles[CameraIndex])
*显示图像
dev_display (Image)
*错误信息提示
Message := ['Camera ’ + CameraIndex,'Pose # ’ + PoseIndex]
*信息颜色
Color := [‘black’,‘black’]
* 是否显示错误信息变量
ShowErrorMsg := false
try
* 在图像中找到标定板,提取其中的圆点,并将其信息存入标定数据模型中
find_calib_object (Image, CalibDataID, CameraIndex, 0, PoseIndex, [], [])
* 获取标定板外框的轮廓, 方便查看
get_calib_data_observ_contours (Caltab, CalibDataID, ‘caltab’, CameraIndex, 0, PoseIndex)
*获取标定板内圆点的轮廓, 方便查看
get_calib_data_observ_contours (Marks, CalibDataID, ‘marks’, CameraIndex, 0, PoseIndex)
*显示标定板外框轮廓、圆点轮廓
dev_display (Caltab)
dev_display (Marks)
catch (Exception)
* 设置显示错误信息变量为true
ShowErrorMsg := true
*忽略的图像数量+1
NumIgnoredImg := NumIgnoredImg + 1
if (Exception[0] == 8402)
* 算子find_calib_object 没有找到标定板
Message := [Message,‘No calibration tab found!’]
*颜色设置为红色
Color := [Color,‘red’]
elseif (Exception[0] == 8404)
* find_calib_object could not extract the marks
*算子 find_calib_object 找不到圆点
Message := [Message,‘Marks were not identified!’]
*颜色设置为红色
Color := [Color,‘red’]
else
* 如果出现未知错误则添加以下信息到message
Message := [Message,‘Unknown Exception!.’]
*颜色设置为红色
Color := [Color,‘red’]
endif
*添加忽略图像信息到Message
Message := [Message,‘This image will be ignored.’]
*颜色设置为红色
Color := [Color,‘red’]
endtry
*在对应相机的窗口显示Message信息
disp_message (WindowHandles[CameraIndex], Message, ‘window’, 12, 12, Color, ‘true’)
if (ShowErrorMsg)
* 显示错误状态
enforce_visualization (WindowHandles)
disp_continue_message (WindowHandles[3], ‘black’, ‘true’)
stop ()
endif
endfor
enforce_visualization (WindowHandles)
endfor

*如果每个相机可用于标定的图像数量大于10
if ((NumPoses * NumCameras) - NumIgnoredImg >= NumCameras * 10)
*标定图像
calibrate_cameras (CalibDataID, Error)
else
*否则,添加错误信息到message
Message := ‘Too few marks were provided!’
Message[1] := ‘Please adapt the parameters for’
Message[2] := ‘extraction of the marks or provide’
Message[3] := ‘more images with better quality.’
*颜色设置为红色、黑色
Color := [‘red’,‘black’,‘black’,‘black’]
*显示错误信息,提醒添加图像数量
disp_message (WindowHandles[0], Message, ‘window’, 12, 12, Color, ‘true’)
return ()
endif

*创建一个相机设置模型, 并确定合适的世界坐标系
get_calib_data (CalibDataID, ‘model’, ‘general’, ‘camera_setup_model’, CameraSetupModelID)
*世界坐标系将由指数为0的相机标定板图像中标定板图像进行确定
RefPoseIndex := 0
*获取参考相机ID
get_calib_data (CalibDataID, ‘model’, ‘general’, ‘reference_camera’, RefCameraID)
*获取参考相机世界坐标
get_calib_data (CalibDataID, ‘calib_obj_pose’, [0,RefPoseIndex], ‘pose’, PoseCam0Indx0)
*设置原点位置
set_origin_pose (PoseCam0Indx0, 0, 0, CaltabThickness, ReferencePose)
*设置相机坐标系位置
set_camera_setup_param (CameraSetupModelID, ‘general’, ‘coord_transf_pose’, ReferencePose)

*判断文件是否再在, 方便写入,如果没有,生成文件
file_exists (‘four_camera_setup_model.csm’, FileExists)
if (not FileExists)
write_camera_setup_model (CameraSetupModelID, ‘four_camera_setup_model.csm’)
endif

5)标定结果显示
*相机参数
*获取相机标定的内参数项目名列表
get_calib_data (CalibDataID, ‘camera’, 0, ‘params_labels’, ParLabels)
*第一个相机内参数的数值
get_camera_setup_param (CameraSetupModelID, 0, ‘params’, CamPar0)
*第二个相机内参数的数值
get_camera_setup_param (CameraSetupModelID, 1, ‘params’, CamPar1)
*第三个相机内参数的数值
get_camera_setup_param (CameraSetupModelID, 2, ‘params’, CamPar2)
*第四个相机内参数的数值
get_camera_setup_param (CameraSetupModelID, 3, ‘params’, CamPar3)

  • 相机外参数
  • 获取相机标定的外参数项目名列表
    get_calib_data (CalibDataID, ‘camera’, 0, ‘pose_labels’, PoseLabels)
    *第一个相机外参数的数值
    get_camera_setup_param (CameraSetupModelID, 0, ‘pose’, CamPose0)
    *第二个相机外参数的数值
    get_camera_setup_param (CameraSetupModelID, 1, ‘pose’, CamPose1)
    *第三个相机外参数的数值
    get_camera_setup_param (CameraSetupModelID, 2, ‘pose’, CamPose2)
    *第四个相机外参数的数值
    get_camera_setup_param (CameraSetupModelID, 3, ‘pose’, CamPose3)
    *标定结果
    *显示相机内参
    disp_camera_parameters_multi_view_4 (WindowHandles, ParLabels, CamPar0, CamPar1, CamPar2, CamPar3)
    disp_continue_message (WindowHandles[3], ‘black’, ‘true’)
    stop ()
  • 显示相机外参
    disp_camera_poses_multi_view_4 (WindowHandles, PoseLabels, CamPose0, CamPose1, CamPose2, CamPose3)

多个相机内外参标定详解[halcon]相关推荐

  1. rs_D455相机内外参标定+imu联合标定

    IMU标定 <launch><node pkg="imu_utils" type="imu_an" name="imu_an&quo ...

  2. 一文详解Camera-IMU内外参标定原理

    作者丨Bjergsen@知乎 来源丨https://zhuanlan.zhihu.com/p/68863677 编辑丨3D视觉工坊 在vio系统中,camera-imu间内外参精确与否对整个定位精度起 ...

  3. 【相机标定与三维重建原理及实现】学习笔记1——相机模型数学推导详解

    目录 前言 一.小孔成像模型 二.坐标系的变换 1.世界坐标系到相机坐标系的变换(刚体变换)[xw^→xc^\boldsymbol {\hat{x_{w}}}\rightarrow \boldsymb ...

  4. imu相机标定_camera-imu内外参标定

    在vio系统中,camera-imu间内外参精确与否对整个定位精度起着重要的作用.所以良好的标定结果是定位系统的前提工作. 目前标定算法主要分为离线和在线标定,离线标定以kalibr为代表,能够标定c ...

  5. 计算机视觉|针孔成像,相机内外参及相机标定,矫正的重要性

    计算机视觉|相机内外参及相机标定,矫正的重要性 这篇博客将介绍针孔成像,透镜(弥补了针孔成像曝光不足成像速度慢的缺点,但引进了畸变,主要是径向畸变和切向畸变,径向畸变主要是离中心越远越弯曲,切向畸变当 ...

  6. ICRA 2023 | 最新激光雷达-相机联合内外参标定,一步到位!

    点击下方卡片,关注"自动驾驶之心"公众号 ADAS巨卷干货,即可获取 今天自动驾驶之心很荣幸邀请到石头,为大家分享ICRA 2023最新的激光雷达-相机的联合标定方法,可同时标定内 ...

  7. 单目摄像头的内外参标定

    任务动机:基于ORB-SLAM3+单目广角摄像头进行二次开发,辅助激光导航实现机器人全局重定位.需要对单目摄像头进行内参和外参标定. 任务描述: 1. 镜头畸变和内参标定 用棋盘格标定 2. 摄像机与 ...

  8. 【python教程入门学习】Python函数定义及传参方式详解(4种)

    这篇文章主要介绍了Python函数定义及传参方式详解(4种),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 一.函数初识 1.定 ...

  9. 详解:Camera-IMU内外参标定原理

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 在vio系统中,camera-imu间内外参精确与否对整个定位精度 ...

最新文章

  1. python拷贝linux文件到windows_windows python文件拷贝到linux上执行问题
  2. ubuntu安装KVM
  3. Android Fragment中ListView的OnItemClickListener无效
  4. 【数字信号处理】相关函数应用 ( TDOA 时差估计 | 时间差与距离差 | 方向定位与精准定位 | 信号描述 | 通过相关函数求时间差 )
  5. 利用redis实现分布式请求防重复提交
  6. Linux之文件压缩与打包
  7. 阿里巴巴开源项目nginx_concat_module企业部署实例
  8. Android Kotlin Exception处理
  9. 数字图像处理频域滤波实现低通与高通滤波(包含matlab代码)
  10. WPF窗口允许通过拖放进行切换
  11. Atitit 调试工具模块 保存序列化map参数 mybatis调试sql selectid 查看mybatis真实sql 1.1. 对象序列化功能 序列化为bytearr 文件等 1 1.2.
  12. 数组对象转json格式
  13. ubuntu20.04鼠标只能移动不能点击+键盘无法输入问题
  14. 2021-07-14软件测试实习所学内容
  15. HTML_canvas
  16. 【Altium designer】PCB 各层简介
  17. Redis Java连接使用
  18. 数量技术宅·安徽财经大学 线上策略分享会
  19. 杭电acm的第1000题c语言解法
  20. 183套免费简历模板,助大伙找个好工作

热门文章

  1. 5G旗舰标配LPDDR5,宁配吗?
  2. 用软件查看内存大小和插槽数
  3. Python Django,静态资源托管
  4. 推荐一个好用的图片压缩网站!清晰度不变的同时体积减小一大半
  5. 场效应管调光电路图_场效应管做开关电路图(两款电路图分享)
  6. 手把手教你如何在Unity中使用UnityGoogle.Protobuf3(三) 序列化与反序列化
  7. windows开启ftp服务器
  8. foursquare_如何通过短信使用Facebook,Twitter,Google +和Foursquare
  9. IIC软件协议及硬件知识汇总
  10. 一定要知道!好的设计竟能如此重要