Use linear calibration board for camera distortion correction and 9-point calibration (halcon)

Picture of linear calibration board:

Insert picture description here
Insert picture description here
Insert picture description here
Insert picture description here
Insert picture description here
Insert picture description here
Insert picture description here
Insert picture description here
Insert picture description here
Insert picture description here
Insert picture description here
Insert picture description here
Insert picture description here
Insert picture description here
Insert picture description here
Insert picture description here
Insert picture description here

Insert picture description here

Picture of mechanical tip position:

Insert picture description here
Insert picture description here
Insert picture description here
Insert picture description here
Insert picture description here
Insert picture description here
Insert picture description here

Insert picture description here
Insert picture description here

Processing code

read_image (Image, '直线标定板图片/Left201118140641772.bmp')
get_image_size (Image, Width, Height)
dev_close_window ()
dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
dev_display (Image)
* Image Acquisition 01: Code generated by Image Acquisition 01
list_files ('直线标定板图片', ['files','follow_links'], ImageFiles)
tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles)
gen_empty_obj (Edges)
*|ImageFiles|
for Index := 0 to |ImageFiles| - 1 by 1
    read_image (Image, ImageFiles[Index])
    
    edges_sub_pix (Image, ImageEdges, 'canny', 1, 10, 40)
    segment_contours_xld (ImageEdges, SplitEdges, 'lines_circles', 5, 4, 2)
    select_shape_xld (SplitEdges, SelectedEdges, 'contlength', 'and', 30, 100000)
    concat_obj (Edges, SelectedEdges, Edges)
    dev_display (Image)
    dev_set_colored (12)
    dev_display (SelectedEdges)
*     wait_seconds (0.1)
endfor
stop ()

radial_distortion_self_calibration (Edges, CalibrationEdges, Width, Height, 0.01, 42, 'division', 'variable', 0, CamParMultiImage)
dev_clear_window ()
dev_set_colored (12)
dev_display (CalibrationEdges)


PosInImageX:=0
PosInImageY:=0
RadiusInImage:=0
*直线畸变矫正准备
change_radial_distortion_cam_par ('fixed', CamParMultiImage, 0, CamParMultiImageRect)
get_domain (Image, Domain)
create_metrology_model (MetrologyHandle)
* Image Acquisition 01: Code generated by Image Acquisition 01
list_files ('weizhi', ['files','follow_links'], ImageFiles)
tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles)
for Index := 0 to |ImageFiles| - 1 by 1
    read_image (Image, ImageFiles[Index])
    * 直线标定
    change_radial_distortion_image (Image, Domain, ImageRectified, CamParMultiImage, CamParMultiImageRect)
    binary_threshold (ImageRectified, Region, 'max_separability', 'dark', UsedThreshold)
    fill_up (Region, RegionFillUp)
    difference (RegionFillUp, Region, RegionDifference)
    fill_up (RegionDifference, RegionFillUp1)
    connection (RegionFillUp1, ConnectedRegions)
    select_shape_std (ConnectedRegions, SelectedRegions, 'max_area', 70)
    smallest_circle (SelectedRegions, Row, Column, Radius)
    
    add_metrology_object_circle_measure (MetrologyHandle, Row, Column, Radius, Radius/10, Radius/60, 1, 90, ['measure_distance','min_score'], [Radius/30,0.2], Index1)
    apply_metrology_model (ImageRectified, MetrologyHandle)
    gen_empty_obj (Contours)
    get_metrology_object_measures (Contours, MetrologyHandle, 'all', 'all', Row1, Column1)
    get_metrology_object_result (MetrologyHandle, 'all', 'all', 'result_type', 'all_param', Parameter)
    get_metrology_object_result_contour (Contour, MetrologyHandle, 'all', 'all', 1.5)
    
    dev_display (ImageRectified)
    dev_display (Contour)
    PosInImageX[Index]:=Parameter[1]
    PosInImageY[Index]:=Parameter[0]
    RadiusInImage[Index]:=Parameter[2]
endfor
stop ()

MacX:=[154.394,151.394,148.394,154.394,151.394,148.394,154.394,151.394,148.394]
MacY:=[-12.367,-12.367,-12.367,-14.368,-14.368,-14.368,-16.367,-16.367,-16.367]


PointImageDis:=0
PointMacDis:=0

distance_pp (PosInImageY[0], PosInImageX[0], PosInImageY[1], PosInImageX[1], Distance)
PointImageDis[0]:=Distance

distance_pp (MacY[0], MacX[0], MacY[1], MacX[1], Distance)
PointMacDis[0]:=Distance

distance_pp (PosInImageY[1], PosInImageX[1], PosInImageY[2], PosInImageX[2], Distance)
PointImageDis[1]:=Distance

distance_pp (MacY[1], MacX[1], MacY[2], MacX[2], Distance)
PointMacDis[1]:=Distance



distance_pp (PosInImageY[3], PosInImageX[3], PosInImageY[4], PosInImageX[4], Distance)
PointImageDis[2]:=Distance

distance_pp (MacY[3], MacX[3], MacY[4], MacX[4], Distance)
PointMacDis[2]:=Distance

distance_pp (PosInImageY[4], PosInImageX[4], PosInImageY[5], PosInImageX[5], Distance)
PointImageDis[3]:=Distance

distance_pp (MacY[4], MacX[4], MacY[5], MacX[5], Distance)
PointMacDis[3]:=Distance



pix:=PointMacDis[0]/PointImageDis[0]


vector_to_hom_mat2d (PosInImageX, PosInImageY, MacX, MacY, HomMat2D)//求解变换矩阵HomMat2D
affine_trans_point_2d (HomMat2D, PosInImageX, PosInImageY, Qx, Qy)//根据模板中心坐标求取距离相机中心实际距离

actual results

Insert picture description here

Guess you like

Origin blog.csdn.net/cashmood/article/details/111942272