halcon标定单目相机

1.内参标定:

(1)打开标定助手

(2)选择标定板的描述文件

(3)选择相机模型

(4)填入单个像素的宽高(看相机说明)和焦距(看镜头说明书)

(5)点击标定按钮

(6)保存内参文件

2.外参标定

代码如下所示:

cpp 复制代码
* Attention:
* This program reads the internal camera parameters from the file
* 'camera_parameters.dat', which, e.g., could be generated by the program
* 'camera_calibration_internal.hdev'
* 
ImgPath := 'E:/VS************/pantograph_picture20260110/BR - new2/'
*########################test_code##########################
*获取图片在系统中的绝对路径
get_system ('image_dir', WorkingDirectory)
*########################test_code##########################
dev_close_window ()
dev_open_window (0, 0, 852, 700, 'black', WindowHandle)
dev_update_off ()
dev_set_draw ('margin')
dev_set_line_width (1)
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
* Read the internal camera parameters from file
try
    *!!读取相机内参
    cacamera_param_Path:='E:/************/CamParam_New.cal'
    read_cam_par (cacamera_param_Path, CamParam)
catch (Exception)
    * run 'camera_calibration_internal.hdev' first to generate camera
    * parameter file 'camera_parameters.dat'
    stop ()
endtry
* 
* Determine the external camera parameters and world coodinates from image points
* 
* The external camera parameters can be determined from an image, where the
* calibration plate is positioned directly on the measurement plane
*??(这句话可能是错的)通过将标定板直接放置在测量尺子的平面上,就能获取图像点到世界坐标的外部参数
*#######################################原始代码_start###################################
* read_image (Image, ImgPath + 'calib_11')
*#######################################原始代码_end###################################
read_image (Image, ImgPath + 'pic1')
*#######################################new_code_end###################################
dev_display (Image)
CaltabName:='E:/*************/caltab_1000mm.descr'
*#######################################new_code_start###################################
*这个是'caltab_30mm.descr'文件路径
* CaltabName := 'E:/**********calib/caltab_30mm.descr'
*#######################################new_code_end###################################
*!!创建了一个标定数据容器,用于存储和管理所有标定相关的信息和参数。
*参数1:标定装置类型,默认使用标定板。参数2:相机数量。参数3:标定物体数量
create_calib_data ('calibration_object', 1, 1, CalibDataID)
* Here, the final camera parameters are already known and can be used instead
* of the starting values used in the program 'camera_calibration_internal.hdev'
*!!设置标定数据模型的相机初始化参数和类型。参数1:用于标识和管理整个标定过程的数据结构
*!!参数2:相机索引。参数3:相机类型。参数4:相机内参
set_calib_data_cam_param (CalibDataID, 0, [], CamParam)
*!!在标定模型中定义一个标定对象。参数1:标定数据模型的句柄。参数2:标定对象的下标
*!!参数3:标定板的描述文件名(里面包含标定板的各个信息,包括标定点的直径,单位为mm,行列数,行列间距,单位为mm。等信息)
set_calib_data_calib_object (CalibDataID, 0, CaltabName)
*!!找到标定板,并在标定数据模型中设置抽取的点和轮廓。参数1:输入的图像。
*!!参数2:标定数据句柄,包含相机参数和标定板信息。参数3:相机索引。参数4:标定物体索引
*!!参数5:位姿索引号,它要与get_calib_data_observ_points算子的参数4保持一致
*!!参数6,参数7:初始化行列坐标,这两个参数可选
find_calib_object (Image, CalibDataID, 0, 0, 1, [], [])
*!!用于获取标定板检测结果的可视化轮廓。它从标定数据对象中提取之前通过find_calib_object检测到的标定板的边界轮廓。
*!!参数1:检测到的标定板边缘轮廓。参数2:标定数据句柄​。参数3: 指定要获取的轮廓类型
*!!参数4:相机索引。参数5:标定物体索引。参数6:位姿索引
get_calib_data_observ_contours (Caltab, CalibDataID, 'caltab', 0, 0, 1)
*!!从标定数据模型中,获取用于标定的特定图像上观测到的所有校准板(标定板)角点的实际图像坐标。
*即标定过程中,第几张图片的第几个标定板上的角点,在图像中具体的像素位置。参数1:标定数据模型的句柄。
*参数2:要查询的相机的索引号。参数3:要查询的标定板对象的索引号。参数4:要查询的图像的索引号。
*参数5、参数6:角点的行、列坐标。单位都是像素。参数7:角点在图中的索引号,从左上角开始计数。
*参数8:返回参数4的图像中,标定坐标系相对于相机坐标系的位姿。注意!!!!!它就是计算出来的外参!!!!!!!!
get_calib_data_observ_points (CalibDataID, 0, 0, 1, RCoord, CCoord, Index, PoseForCalibrationPlate)
dev_set_color ('green')
dev_display (Caltab)
dev_set_color ('red')
*!!显示标定板的轮廓。在图像中投影和可视化标定板的3D模型。参数1:标定板应可视化的窗口。
*参数2:标定板描述文件的名称。参数3:相机内参。参数4:标定板相对于相机的位姿。
*参数5:缩放因子。>1:放大标定板。0到1之间:缩小标定板。等于1:以真实世界尺寸(1:1)显示。
disp_caltab (WindowHandle, CaltabName, CamParam, PoseForCalibrationPlate, 1)
dev_set_line_width (3)
*!!根据给定的横纵坐标和半径,在图中画圆
disp_circle (WindowHandle, RCoord, CCoord, gen_tuple_const(|RCoord|,1.5))
* caltab_points (CaltabName, X, Y, Z)
* calibrate_cameras (CalibDataID, Error)
* To take the thickness of the calibration plate into account, the z-value
* of the origin given by the camera pose has to be translated by the
* thickness of the calibration plate.
* Deactivate the following line if you do not want to add the correction.
*!!将PoseForCalibrationPlate中的坐标原点,沿着它的X、Y、Z轴平移(参数2,参数3,参数4)个单位
*该单位是以 PoseForCalibrationPlate中的坐标系单位计算的。得到新的坐标原点PoseForCalibrationPlate
set_origin_pose (PoseForCalibrationPlate, 0, 0, 0.00075, PoseForCalibrationPlate)
clear_calib_data (CalibDataID)
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
*############方法1结束############

*###############################test_code_start#########################################
*测试用计算出的外参和内参,反推出标定板的真实长宽
ImageRows:=[528,455]
ImageCols:=[693,2065]

* ImageRows:=[529,1858]
* ImageCols:=[693,793]
image_points_to_world_plane (CamParam,PoseForCalibrationPlate,ImageRows,ImageCols,'m',WorldX,WorldY)
Distance := sqrt((WorldX[1]-WorldX[0])*(WorldX[1]-WorldX[0]) + (WorldY[1]-WorldY[0])*(WorldY[1]-WorldY[0]))

(1)读取上面内参标定保存的文件

(2)

(3)计算出标定的外参(单张图片的)

(4)测试标定结果的准确性

相关推荐
FLJwu21 小时前
存储与固件量产实战01:运动相机TF卡量产翻车实录!V30≠4K可用,90%OEM踩中的隐形售后坑
经验分享·数码相机·相机
FLJwu2 天前
整机可靠性测试实战 03:防水密封可靠性|IP67/IP68 结构设计、密封胶圈选型与泡水测试量产翻车整改
经验分享·数码相机·相机
FLJwu5 天前
传感器与图像 ISP 实战 03:运动相机图像量产一致性|批次色差、白平衡漂移、整机标定与出厂图像质检方案|20 年源头工厂量产经验
图像处理·经验分享·数码相机·相机·isp
蓝宝石的傻话6 天前
MiBee Eye Notebook:把闲置笔记本变成一台带麦克风的网络摄像头
数码相机·rust
大熊背7 天前
《Color constancy by characterization of illumination chromaticity》之色度色域最大化算法(一)
数码相机·算法·白平衡·色度色域
xwz小王子7 天前
【通用世界模型】把机器人动作变成像素流!NVIDIA 提出 Hydra-0:跨人类、单臂与双臂统一预测和控制
数码相机·机器人
菩提树下的凡夫8 天前
激光振镜双目结构光3D相机丢点问题
数码相机·3d
YMWM_9 天前
查看realsense相机序列号脚本
开发语言·python·数码相机
视觉工程师070610 天前
工业相机选择CCD 还是 CMOS
数码相机·视觉检测
FLJwu10 天前
运动相机 ID 外观与壳体开模实战 02:壳体注塑缺陷|缩水、气泡、披风、熔接痕量产改善方案|20 年源头工厂量产经验
经验分享·数码相机·相机