halcon 相机标定

1.准备标定板

在halcon中使用gen_caltab算子快捷地生成标定板图像,用于标定板的制作。

gen_caltab算子原型如下

gen_caltab(:: XNum,YNum,MarkDist,DiameterRatio,CalPlateDescr,CalPlatePSFile :)

 其中XNum、YNum分别表示每行和每列的园点标记的数量。MarkDist表示两个标记之间的间隔距离,单位是m。DiameterRatio用来设置标记点的直径,表示一个比例关系,直径的长度就是用间隔MarkDist乘以比例DiameterRatio的结果。CalPlateDescr为标定板描述文件的存放路径。CalPlatePSFile为生成的图像文件,即".ps"文件的存放路径,可以直接用Photoshop打开进行编辑。

gen_caltab (7, 7, 0.0125, 0.5, 'E:/caltab.descr', 'E:/caltab.ps')

 只使用内参(相机参数)进行校正

*初始化一个相机参数
StartCamPar := [0.012,0,0.00000375,0.00000375,328,246,656,492]
*1.相机焦距
*2.相机的畸变系数Kappa,单位是m-2
*3.单个像元的宽,单位是m
*4.单个像元的高,单位是m
*5.中心点的X轴的坐标,单位是像素
*6.中心点的Y轴的坐标,单位是像素
*7.8.图像的宽高,单位像素
*建立一个CalibDataID,该参数相当于标定对象的集合,包含相机标定所需的信息
create_calib_data ('calibration_object', 1, 1, CalibDataID)
*设置相机的类型
set_calib_data_cam_param (CalibDataID, 0, 'area_scan_division', StartCamPar)
*生成标定文件
gen_caltab (7, 7, 0.0125, 0.5, 'caltab.descr', 'caltab.ps')
*设置标定板数据的路径
set_calib_data_calib_object (CalibDataID,0, 'caltab.descr')
*设置图像的数量
NumImages:=9
for I :=1 to NumImages by 1
    *是否显示错误信息变量
    ShowErrorMsg:=false
    try
        read_image (Image, 'E:/Images/calibration/'+I)
        *寻找标定板
        find_calib_object (Image, CalibDataID, 0, 0, I, [], [])
        *方式一
        *获得标定板外框轮廓
        get_calib_data_observ_contours (Caltab, CalibDataID, 'caltab', 0, 0, I)
        *获取标定板标志轮廓
        get_calib_data_observ_contours (Marks, CalibDataID, 'marks', 0, 0, I)
        *显示标定板外框轮廓
        dev_display (Caltab)
        *显示标志版标志轮廓
        dev_display (Marks)
        *方式一
        *方式二
        *get_calib_data (CalibDataID, 'camera', 0, 'type', CameraType)
        *方式二
        *从校准数据模型中获取基于点的观测数据
        get_calib_data_observ_points (CalibDataID, 0, 0, I, Row, Column, Index, StartPose) 
    catch (Exception)
        *设置显示错误信息变量为true
        ShowErrorMsg:=true
        
    endtry
    
endfor
*使用calibrate_cameras算子对相机进行标定,用于计算相机的内外参数
calibrate_cameras (CalibDataID, Error)
*使用get_calib_data
get_calib_data (CalibDataID, 'camera', 0, 'params', CamParam)
get_calib_data (CalibDataID, 'calib_obj_pose', [0,1], 'pose', Pose)
clear_calib_data (CalibDataID)
*使用相机参数校正畸变
*CameraParameters为相机的内部参数
CameraParameters := CamParam[1:8]
*CameraPose为相机的外部参数,即位变
CameraPose := Pose
stop()
*读取待校正的图像
read_image (Image1, 'E:/Images/calibration/10.bmp')
*对于area(diversion)相机模型(7个参数)
change_radial_distortion_cam_par('adaptive',CameraParameters,0,CarParamVirtualFixed)
*对于area(多项式)相机模型(12个参数)
*change_radial_distortion_cam_par('adaptive',CameraParameters,[0,0,0,0,0],CarParamVirtualFixed)
*上述相机模型选一种后进行下面的map_image
*创建一个投射图,其描述图像与其相应正在改变的径向畸变,而对于12个参数的畸变包括径向和切向畸变
gen_radial_distortion_map(Map,CameraParameters,CarParamVirtualFixed,'bilinear')
map_image(Image1,Map,ImageMapped)

 使用了内参(相机参数)和外参(位置参数)

*初始化一个相机参数
StartCamPar := [0.012,0,0.00000375,0.00000375,328,246,656,492]
*1.相机焦距
*2.相机的畸变系数Kappa,单位是m-2
*3.单个像元的宽,单位是m
*4.单个像元的高,单位是m
*5.中心点的X轴的坐标,单位是像素
*6.中心点的Y轴的坐标,单位是像素
*7.8.图像的宽高,单位像素
*建立一个CalibDataID,该参数相当于标定对象的集合,包含相机标定所需的信息
create_calib_data ('calibration_object', 1, 1, CalibDataID)
*设置相机的类型
set_calib_data_cam_param (CalibDataID, 0, 'area_scan_division', StartCamPar)
*生成标定文件
gen_caltab (7, 7, 0.0125, 0.5, 'caltab.descr', 'caltab.ps')
*设置标定板数据的路径
set_calib_data_calib_object (CalibDataID,0, 'caltab.descr')
*设置图像的数量
NumImages:=9
for I :=1 to NumImages by 1
    *是否显示错误信息变量
    ShowErrorMsg:=false
    try
        read_image (Image, 'E:/Images/calibration/'+I)
        *寻找标定板
        find_calib_object (Image, CalibDataID, 0, 0, I, [], [])
        *remove_calib_data_observ (CalibDataID, 0, 0, 0)
        *获得标定板外框轮廓
        get_calib_data_observ_contours (Caltab, CalibDataID, 'caltab', 0, 0, I)
        *获取标定板标志轮廓
        get_calib_data_observ_contours (Marks, CalibDataID, 'marks', 0, 0, I)
        *显示标定板外框轮廓
        dev_display (Caltab)
        *显示标志版标志轮廓
        dev_display (Marks)
        *从校准数据模型中获取基于点的观测数据
        get_calib_data_observ_points (CalibDataID, 0, 0, I, Row, Column, Index, StartPose) 
        *get_calib_data (CalibDataID, 'camera', 0, 'type', CameraType)
    catch (Exception)
        *设置显示错误信息变量为true
        ShowErrorMsg:=true
        
    endtry
    
endfor
*使用calibrate_cameras算子对相机进行标定,用于计算相机的内外参数
calibrate_cameras (CalibDataID, Error)
*使用get_calib_data
get_calib_data (CalibDataID, 'camera', 0, 'params', CamParam)
get_calib_data (CalibDataID, 'calib_obj_pose', [0,1], 'pose', Pose)
clear_calib_data (CalibDataID)
*使用相机参数校正畸变
*CameraParameters为相机的内部参数
CameraParameters := CamParam[1:8]
*CameraPose为相机的外部参数,即位变
CameraPose := Pose
stop()
*读取待校正的图像
read_image (Image1, 'E:/Images/calibration/10.bmp')
scaleParam:=1920/1080.0
*scaleParam:=656/492.0
*调整原点的位姿
set_origin_pose (CameraPose, -0.066324, -0.047, 0, rectificationPose)
*生成用于校正的映射图,用于描述图像坐标系与世界坐标系之间的映射
gen_image_to_world_plane_map (rectificationMap, CameraParameters, rectificationPose, 656, 492, 656, 492, scaleParam/656, 'bilinear')
*利用映射图rectificationMap进行图像校正
map_image (Image1, rectificationMap, ImageMapped)
*dev_clear_window ()
dev_display (ImageMapped)
*初始化一个相机参数
StartCamPar := [0.012,0,0.00000375,0.00000375,328,246,656,492]
*1.相机焦距
*2.相机的畸变系数Kappa,单位是m-2
*3.单个像元的宽,单位是m
*4.单个像元的高,单位是m
*5.中心点的X轴的坐标,单位是像素
*6.中心点的Y轴的坐标,单位是像素
*7.8.图像的宽高,单位像素
*建立一个CalibDataID,该参数相当于标定对象的集合,包含相机标定所需的信息
create_calib_data ('calibration_object', 1, 1, CalibDataID)
*设置相机的类型
set_calib_data_cam_param (CalibDataID, 0, 'area_scan_division', StartCamPar)
*生成标定文件
gen_caltab (7, 7, 0.0125, 0.5, 'caltab.descr', 'caltab.ps')
*设置标定板数据的路径
set_calib_data_calib_object (CalibDataID,0, 'caltab.descr')
*设置图像的数量
NumImages:=7
for I :=1 to NumImages by 1
    *是否显示错误信息变量
    ShowErrorMsg:=false
    try
        read_image (Image, 'E:/Images/calibration/'+I)
        *寻找标定板
        find_calib_object (Image, CalibDataID, 0, 0, I, [], [])
        *remove_calib_data_observ (CalibDataID, 0, 0, 0)
        *获得标定板外框轮廓
        get_calib_data_observ_contours (Caltab, CalibDataID, 'caltab', 0, 0, I)
        *获取标定板标志轮廓
        get_calib_data_observ_contours (Marks, CalibDataID, 'marks', 0, 0, I)
        *显示标定板外框轮廓
        dev_display (Caltab)
        *显示标志版标志轮廓
        dev_display (Marks)
        *从校准数据模型中获取基于点的观测数据
        get_calib_data_observ_points (CalibDataID, 0, 0, I, Row, Column, Index, StartPose) 
        
        *remove_calib_data (CalibDataID, 'tool', I)
    catch (Exception)
        *设置显示错误信息变量为true
        ShowErrorMsg:=true
        
    endtry
    
endfor
*使用calibrate_cameras算子对相机进行标定,用于计算相机的内外参数
calibrate_cameras (CalibDataID, Error)
*使用get_calib_data
get_calib_data (CalibDataID, 'camera', 0, 'params', CamParam)
get_calib_data (CalibDataID, 'calib_obj_pose', [0,1], 'pose', Pose)
*使用相机参数校正畸变
*CameraParameters为相机的内部参数
CameraParameters := CamParam[1:8]
*CameraPose为相机的外部参数,即位变
CameraPose := Pose
stop()
*读取待校正的图像
read_image (Image1, 'E:/Images/calibration/10.bmp')
get_image_pointer1(Image1, Pointer, Type, Width, Height)
gen_rectangle1 (ImageRect, 0, 0, Height-1, Width-1)
gen_contour_region_xld (ImageRect, ImageBorder, 'border')
contour_to_world_plane_xld(ImageBorder, ImageBorderWCS, CameraParameters,CameraPose, 1)
smallest_rectangle1_xld (ImageBorderWCS, MinY, MinX, MaxY, MaxX)
set_origin_pose(CameraPose, MinX, MinY, 0.01, PoseForEntireImage)
image_points_to_world_plane(CameraParameters,PoseForEntireImage,[Height/2, Height/2, Height/2+1], [Width/2, Width/2+1, Width/2], 1, WorldPixelX, WorldPixelY)
distance_pp(WorldPixelY[0], WorldPixelX[0], WorldPixelY[1], WorldPixelX[1],WorldLength1)
distance_pp(WorldPixelY[0], WorldPixelX[0], WorldPixelY[2], WorldPixelX[2],WorldLength2)
ScaleForSimilarPixelSize := (WorldLength1+WorldLength2)/2
*  -> determine output image size such that entire input image fits into it
ExtentX := MaxX-MinX
ExtentY := MaxY-MinY
WidthRectifiedImage := ExtentX/ScaleForSimilarPixelSize
HeightRectifiedImage := ExtentY/ScaleForSimilarPixelSize
*  create mapping with the determined parachuangjia
*创建一个投射图,其描述图像平面与坐标轴系统中平面Z为零之间的映射
gen_image_to_world_plane_map(Map, CameraParameters, PoseForEntireImage, Width, Height, WidthRectifiedImage, HeightRectifiedImage, \
                            ScaleForSimilarPixelSize, 'bilinear')
clear_calib_data (CalibDataID)
* Map the images
map_image (Image1, Map, ImageMapped)
*Endfor
*https://www.gkbc8.com/thread-13594-1-1.html
gen_empty_obj (images)
read_image (Image1, 'E:/Images/aerial.bmp')
read_image (Image2, 'E:/Images/barbara.bmp')
read_image (Image3, 'E:/Images/dollar.bmp')
concat_obj (images, Image1, images)
concat_obj (images, Image2, images)
concat_obj (images, Image3, images)
count_obj (images, Number1)
remove_obj (images, images, 2)
count_obj (images, Number2)
select_obj (images, image, 1)
dev_clear_obj (images)
gen_empty_obj (images)
count_obj (images, Number3)
*tuple_length
set_color ([H1BCA0393490], 'green')
set_tposition ([H1BCA0393490], 24, 12)
set_font ([H1BCA0393490], Number3)
write_string ([H1BCA0393490], 'hello')

Calibration校准halcon算子,持续更新_CSDN博客-CSDN博客

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值