halcon学习-相机标定与图像径向或透视畸变的校正

1.初始化相机并设置相机内部参数和相机类型,确定校准目标。

gen_cam_par_area_scan_division

create_calib_data

set_calib_data_cam_param

set_calib_data_calib_object


2.校正相机

find_calib_object

get_calib_data(CalibDataID, ‘camera’, 0, ‘init_params’, StartCamPar)

get_calib_data_observ_points

get_calib_data_observ_contours

gen_cross_contour_xld


calib_camera

calibrate_cameras

get_calib_data (CalibDataID, ‘camera’, 0, ‘params’, CamParam)


3.校正前的准备

get_calib_data (CalibDataID, ‘calib_obj_pose’, [0,I - 1], ‘pose’, Pose)

获取目标位姿

set_origin_pose (Pose, -1.125, -1.0, 0, PoseNewOrigin)

在给定DXDYDZ平面内平移原点位姿

gen_image_to_world_plane_map (MapSingle, CamParam, PoseNewOrigin, 768, 576, 900, 800, 0.0025, ‘bilinear’)

生成一个投影映射图,它描述了在一个世界坐标系中图像平面与z=0平面(测量平面)之间的映射。此映射可用于使用map_image操作符对图像进行校正。校正后的图像既无径向畸变,也无透视畸变;它对应于由垂直于测量平面的无畸变相机获取的图像

concat_obj(Maps, MapSingle, Maps)


4.校正

map_image(Image, MapSingle, ImageMapped)

学习的算子:

pose_to_hom_mat3d将三维位姿转换为齐次变换矩阵。

affine_trans_point_3d对点应用任意仿射三维变换。

将模型点转换为摄像机坐标系。


project_3d_point项目3D点进入(子)像素图像坐标。

将一个或多个3D点(坐标为X、Y和Z)投影到图像平面(以像素为单位),并以行和列返回结果。坐标X、Y、Z在摄像机坐标系中给定,即,它们描述点相对于摄像机的位置。

例程:

dev_close_window ()
dev_open_window (0, 0, 768 / 2, 576 / 2, 'black', WindowHandle1)
set_display_font (WindowHandle1, 14, 'mono', 'true', 'false')
dev_update_off ()
dev_set_draw ('margin')
dev_set_line_width (2)
* 
* Calibrate the camera.
* 
CalTabDescrFile := 'caltab_big.descr'
* Make sure that the file 'CaltabName' is in the current directory,
* the HALCONROOT/calib directory, or use an absolute path
gen_cam_par_area_scan_division (0.008, 0, 0.0000086, 0.0000086, 384, 288, 768, 576, 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
read_image (Images, 'calib/calib-3d-coord-' + [1:NumImages]$'02d')
for I := 1 to NumImages by 1
    select_obj (Images, Image, I)
    dev_display (Image)
    Message := 'Find calibration plate in\nall calibration images (' + I + '/' + NumImages + ')'
    disp_message (WindowHandle1, 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)
endfor
disp_continue_message (WindowHandle1, 'black', 'true')
stop ()
calibrate_cameras (CalibDataID, Error)
get_calib_data (CalibDataID, 'camera', 0, 'params', CamParam)
gen_empty_obj (Maps)
for I := 1 to NumImages by 1
    * Obtain the pose of the calibration table
    get_calib_data (CalibDataID, 'calib_obj_pose', [0,I - 1], 'pose', Pose)
    set_origin_pose (Pose, -1.125, -1.0, 0, PoseNewOrigin)
    * Generate map
    gen_image_to_world_plane_map (MapSingle, CamParam, PoseNewOrigin, 768, 576, 900, 800, 0.0025, 'bilinear')
    concat_obj (Maps, MapSingle, Maps)
endfor
clear_calib_data (CalibDataID)
* 
* Map the images
* 
dev_open_window (0, 391, 900 / 2, 800 / 2, 'black', WindowHandle2)
set_display_font (WindowHandle2, 14, 'mono', 'true', 'false')
Button := 0
NumImage := 1
for I := 1 to NumImages by 1
    dev_set_window (WindowHandle1)
    dev_set_part (0, 0, 575, 767)
    dev_clear_window ()
    select_obj (Images, Image, I)
    dev_display (Image)
    select_obj (Maps, MapSingle, I)
    map_image (Image, MapSingle, ImageMapped)
    dev_set_window (WindowHandle2)
    dev_set_part (0, 0, 799, 899)
    dev_clear_window ()
    dev_display (ImageMapped)
    Message := 'Calibration image (' + I + '/' + NumImages + ')'
    disp_message (WindowHandle1, Message, 'window', 12, 12, 'black', 'true')
    Message := 'Mapped image'
    disp_message (WindowHandle2, Message, 'window', 12, 12, 'black', 'true')
    if (I < NumImages)
        disp_continue_message (WindowHandle1, 'black', 'true')
        stop ()
    endif
endfor


勇哥另一篇文章也讲得的是这个例子,有详细注释,请查看:

Halcon 映射校正例程注释(map_image) 


————————————————

版权声明:本文为CSDN博主「KKK5」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/weixin_41082581/article/details/97149482


本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2024年3月    »
123
45678910
11121314151617
18192021222324
25262728293031
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864