# halcon 完整代码

* 
* Initialize the program
dev_close_window ()
dev_open_window (0, 0, 768, 576, 'black', WindowHandle)
dev_update_off ()
dev_set_draw ('margin')
dev_set_line_width (3)
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
* 
* Calibrate the camera
* 
* 标定板描述文件 30mm的标定板
CalTabDescrFile := 'caltab_30mm.descr'
* 相机参数
gen_cam_par_area_scan_division (0.008, 0, 0.0000110, 0.0000110, 646, 482, 1292, 964, StartCamPar) 
create_calib_data ('calibration_object', 1, 1, CalibDataID)
set_calib_data_cam_param (CalibDataID, 0, [], StartCamPar)
set_calib_data_calib_object (CalibDataID, 0, CalTabDescrFile)
NumImages := 10
for I := 1 to NumImages by 1
    read_image (Image, 'calib-3d-coord-' + I$'02d')
    dev_display (Image)
    Message := 'Find calibration plate in\nall calibration images (' + I + '/' + NumImages + ')'
    disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')
    * Find the calibration plate
    find_calib_object (Image, CalibDataID, 0, 0, I - 1, [], [])
    get_calib_data (CalibDataID, 'camera', 0, 'init_params', StartCamPar)
    get_calib_data_observ_points (CalibDataID, 0, 0, I - 1, Row, Column, Index, Pose)
   
    get_calib_data_observ_contours (Contours, CalibDataID, 'caltab', 0, 0, I - 1)
    gen_cross_contour_xld (Cross, Row, Column, 6, 0.785398)
    dev_set_color ('green')
    dev_display (Contours)
    dev_set_color ('yellow')
    dev_display (Cross)
   * stop()
endfor
disp_continue_message (WindowHandle, 'black', 'true')
****************得到标定数据并保存在文件中****************
calibrate_cameras (CalibDataID, Error)
get_calib_data (CalibDataID, 'camera', 0, 'params', CamParam)
get_calib_data (CalibDataID, 'calib_obj_pose', [0,9], 'pose', CalobjPose)
write_cam_par (CamParam, 'campar.dat')
read_cam_par('campar.dat', CameraParam)
********************校正图像*****************************
read_image (Image1, 'D:/彭强生毕设/单目标定/img1/calib-3d-coord-01.png')
get_image_size(Image1,Width1,Height1)
*赋值相机内参(带畸变),标定得到的数据
CarParamVirturalFixed:=CameraParam
CarParamVirturalFixed[1]:=0
*转化为无畸变内参,采用adaptive模式
change_radial_distortion_cam_par('adaptive',CameraParam,0,CarParamVirturalFixed)
*生成map
gen_radial_distortion_map(Map,CameraParam,CarParamVirturalFixed,'bilinear')
*使用map校正图像
map_image(Image1,Map,ImageMapped1)
********************计算像素距离**************************
read_image (DisImage, 'D:/彭强生毕设/单目标定/img1/calib-3d-coord-01.png')
get_image_size(DisImage,Width2,Height2)
*赋值相机内参(带畸变),标定后的数据
Image_x1:=100
Image_y1:=100
Distance_xy:=500
Image_x2:=Image_x1 + Distance_xy
Image_y2:=Image_y1 + Distance_xy
*考虑到标定板厚度和后面的双面胶的厚度加起来是5mm
set_origin_pose(CalobjPose,0,0,0.005,PoseNewOrigin)
*将像素点坐标转换为世界坐标(单位m)
image_points_to_world_plane(CameraParam,PoseNewOrigin,Image_x1,Image_y1 ,'m',World_x1,World_y1)
image_points_to_world_plane(CameraParam,PoseNewOrigin,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
*每个像素对应的世界坐标距离
DistanceOnePixel:=DistanceWorld/DistanceImage

*调整世界坐标至中心偏移量
OffSetX:=(Width2/2)*DistanceOnePixel
OffSetY:=(Width2/2)*DistanceOnePixel

**********消除采集图像的畸变*****************
*真实图片测距
*读取图像,实际过程应该改成采集图像
stop()


*调用相机采集图片
open_framegrabber ('GenICamTL', 0, 0, 0, 0, 0, 0, 'progressive', -1, 'default', -1, 'false', 'default', 'MER-132-30UC(SA0120012018)', 0, -1, AcqHandle)
grab_image_start (AcqHandle, -1)
grab_image_async (Image, AcqHandle, -1)
rgb1_to_gray(Image,GrayImage)
close_framegrabber (AcqHandle)


*read_image (ImagePerspective, 'D:/彭强生毕设/单目标定/img1/calib-3d-coord-01.png')
get_image_size(GrayImage,Width3,Height3)
map_image(GrayImage,Map,ImageMapped1)
dev_display(ImageMapped1)

*调整相机外参
tuple_replace(PoseNewOrigin,5,CalobjPose[5],PoseCalibRot)
*设定世界坐标
set_origin_pose(PoseCalibRot,-OffSetX,-OffSetY,0,PoseNewOriginFinal)
*生成map,消除径向畸变与视角畸变
gen_image_to_world_plane_map(Map2,CameraParam,PoseNewOriginFinal,Width3,Height3,Width3,Height3,DistanceOnePixel,'bilinear')
*矫正图像
map_image(GrayImage,Map2,ImageMapped2)

dev_display(ImageMapped2)

*****计算距离***************
stop()
****自己画ROI测量
**真实长度


*******************采集图像******************
* Image Acquisition 01: Code generated by Image Acquisition 01
open_framegrabber ('GenICamTL', 0, 0, 0, 0, 0, 0, 'progressive', -1, 'default', -1, 'false', 'default', 'MER-132-30UC(SA0120012018)', 0, -1, AcqHandle)
grab_image_start (AcqHandle, -1)
grab_image_async (Image, AcqHandle, -1)
rgb1_to_gray(Image,GrayImage)
write_image( GrayImage , 'bmp' , 0 , '1' )
close_framegrabber (AcqHandle)