Halcon标定板标定

halcon标定有自己的标定助手可以演示,不过拿到VS里面却不是很适用。尤其是关于畸变矫正和透视矫正算子的解释也没有,下面两个算子set_origin_pose,gen_image_to_world_plane_map关键参数怎么计算也没有。鄙人研究数日,已经攻克。有缘人可以参考。

*XNum:X轴圆点数量
*YNum:Y轴圆点数量
*MarkDist:圆点间距,单位为米
*DiameterRatio:圆点直径与间距的比率
*CalPlateDescr:标定板描述文件
*CalPlatePSFile:标定板PostScript图案,可以用PhotoShop打开。
gen_caltab(7, 7, 0.0125, 0.5, 'caltab.descr', 'caltab.ps')


dev_close_window ()
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)

read_image (Image, 'Image_1.bmp')
get_image_size (Image, Width, Height)
scale_image_max (Image, Image)
bilateral_filter (Image, Image, ImageBilateral, 3, 20, [], [])

*初始相机参数
*焦距(单位m),
*畸变系数(还没标定前,默认0)
*单个像元宽(单位m),
*单个像元高(单位m),
*中心点X坐标,宽/2(单位pixel),
*中心点Y坐标,高/2(单位pixel),
*图像宽(单位pixel),图像高(单位pixel)
StartCamPar := [0.012, 0, 0.00000185, 0.00000185, Width/2, Height/2, Width, Height]
*创建标定模型
create_calib_data ('calibration_object', 1, 1, CalibDataID)
*设置标定前相机参数
set_calib_data_cam_param (CalibDataID, 0, 'area_scan_division', StartCamPar)
*设置标定板描述文件路径
set_calib_data_calib_object (CalibDataID, 0, 'caltab.descr')

for Index1 := 1 to 22 by 1
    read_image (Image, 'Image_'+ Index1 +'.bmp')
    get_image_size (Image, Width, Height)
    scale_image_max (Image, ImageScaleMax)
    bilateral_filter (ImageScaleMax, ImageScaleMax, ImageBilateral, 3, 20, [], [])
    *查找标定板圆点和边框
    find_calib_object (ImageBilateral, CalibDataID, 0, 0, Index1-1, 'alpha', 0.2)
    *获取所有圆点坐标
    get_calib_data_observ_points (CalibDataID, 0, 0, Index1-1, Row, Column, Index, StartPose)
    *获取边框xld
    get_calib_data_observ_contours (Contours, CalibDataID, 'caltab', 0, 0, Index1-1)
    gen_cross_contour_xld (Cross, Row, Column, 36, 0.785398)
    *在图像中投影并可视化校准板的3D模型。
    disp_caltab (WindowHandle, 'caltab.descr', StartCamPar, StartPose, 1)
*     stop()
endfor

 stop()
*标定
calibrate_cameras (CalibDataID, Error)
*获取标定后的相机内参
get_calib_data (CalibDataID, 'camera', 0, 'params', CamParam)
*获取标定后的相机外参(获取第1幅图位姿的相机外参)
get_calib_data (CalibDataID, 'calib_obj_pose', [0,0], 'pose', CamPose)
disp_caltab (WindowHandle, 'caltab.descr', CamParam, CamPose, 1)

********************校正图像,只矫正径向畸变*****************************
read_image (Image1, 'Image_1.bmp')
get_image_size(Image1,Width1,Height1)
*赋值相机内参(带畸变),标定得到的数据
CarParamVirturalFixed:=CamParam
*转化为无畸变内参,采用adaptive模式
change_radial_distortion_cam_par('adaptive',CamParam,0,CarParamVirturalFixed)
*生成map
gen_radial_distortion_map(Map,CamParam,CarParamVirturalFixed,'bilinear')
*使用map校正图像
map_image(Image1,Map,ImageMapped1)
********************计算像素当量(需要拿居中,没有倾斜的图片对应的相机内外参计算)**************************
read_image (DisImage, 'Image_1.bmp')
get_image_size(DisImage,Width2,Height2)
*赋值相机内参(带畸变),标定后的数据
Image_x1:=10
Image_y1:=10
Distance_xy:=200
Image_x2:=Image_x1 + Distance_xy
Image_y2:=Image_y1 + Distance_xy
*获取标定后的相机外参(获取第1幅图位姿的相机外参)
get_calib_data (CalibDataID, 'calib_obj_pose', [0,0], 'pose', CamPose)
*考虑到标定板厚度和后面的检测物的厚度加起来是1mm,也可以不写这句,默认厚度为0
*set_origin_pose(CamPose_PixelRadio,0,0,0.001,PoseNewOrigin)
*将像素点坐标转换为世界坐标(单位m)
image_points_to_world_plane(CamParam,CamPose,Image_x1,Image_y1 ,'m',World_x1,World_y1)
image_points_to_world_plane(CamParam,CamPose,Image_x2,Image_y2 ,'m',World_x2,World_y2)
*计算世界坐标距离
distance_pp(World_x1,World_y1,World_x2,World_y2,DistanceWorld)
*计算像素坐标
distance_pp(Image_x1,Image_y1,Image_x2,Image_y2,DistanceImage)
*每毫米世界坐标距离=距离对应的像素点个数(每毫米多少个像素)
DistanceOneMilimeter:=DistanceImage/DistanceWorld
*每个像素对应的世界坐标距离(像素当量单位是米,pixel/m)
DistanceOnePixel:=DistanceWorld/DistanceImage
 
*计算把世界坐标系中心偏移到像素坐标系中心的偏移量(这样可以保证坐标系中心重合,图像正常显示)
OffSetX:=(Width2/2)*DistanceOnePixel
OffSetY:=(Height2/2)*DistanceOnePixel
*计算圆心距离
image_points_to_world_plane (CamParam, CamPose, Row, Column, 'mm', X2, Y2)
distance_pp (X2[0], Y2[0], X2[1], Y2[1], Distance1)
*计算X,Y方向的像素当量
* image_points_to_world_plane (CamParam, CamPose, [0,1], [0,1], 'mm', X3, Y3)
* resolution_X:=X3[1] -X3[0]
* tuple_abs (resolution_X, resolution_X)
* resolution_Y:=Y3[1] -Y3[0]
* tuple_abs (resolution_Y, resolution_Y)

 
**********消除采集图像的畸变(包括径向畸变和透视畸变(效果类似投影变换))*****************
read_image (GrayImage, 'Image_22.bmp')
get_image_size(GrayImage,Width3,Height3)
*获取标定后的相机外参(获取第19幅图位姿的相机外参)
get_calib_data (CalibDataID, 'calib_obj_pose', [0,18], 'pose', CamPose)
*设定世界坐标
set_origin_pose(CamPose,-OffSetX,-OffSetY,0,PoseNewOriginFinal)
*生成map,消除径向畸变与视角畸变
gen_image_to_world_plane_map(Map2,CamParam,PoseNewOriginFinal,Width3,Height3,Width3,Height3,DistanceOnePixel,'bilinear')
*矫正图像
map_image(GrayImage,Map2,ImageMapped2)
dev_display(ImageMapped2)
stop()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Douhaoyu/article/details/129874317
今日推荐