| map_image(Image, Map : ImageMapped : : ) map_image使用任意转换Map 转换图像Image,
 例如,先前使用gen_image_to_world_plane_map或gen_radial_畸变_map生成的转换映射。
 
 
 多通道图像Map 必须组织如下:
 Map的高度和宽度定义了ImageMapped输出图像的大小。
 Map中的通道数决定了是否应该使用插补或双线性插补。
 如果Map只包含一个通道,则在转换期间不应用插补。此通道包含“int4”类型的值(对应 HALCON XL中的'int8' 如果'int4'的值范围不够大)
 描述了几何变换的值:
 对于输出图像ImageMapped 中的每个像素,存储输入图像Image中像素的线性化坐标,从中获取灰度值。
 
 
 如果在输入图像像素之间应用双线性插值,则Map 必须由5个通道组成。
 第一个通道又由一个“int4”响应组成。并描述了几何变换。通
 道2-5包含一个“uint2”图像,每个图像包含双线性插值期间使用的四个相邻像素的权重[0…1]。
 如果输出图像ImageMapped 的整体亮度不应与输入图像Image的整体亮度不同,
 则每个像素的四个未缩放权重之和必须为1。
 权重[0…1]缩放到“uint2”图像的值范围,因此保留0到65535之间的整数值。
 
 
 此外,必须以不超过输出图像ImageMapped值范围的方式选择权重。
 四个通道2-5之间的几何关系如下图所示:
 2  3
 4  5
 
 
 四个像素的参考点是左上角的像素。参考点的线性化坐标存储在第一个通道中。
 
 也可以使用包含绝对子像素精确行和列坐标的矢量字段组成的Map (即,字段必须是语义类型“vector_field_absolute”)。
 上面描述的两种Map 类型可以使用convert-map-type转换成这种类型。
 此类型是计算机设备上唯一支持的类型!
 
 
 
 
 
 1.convert_map_type(Map : MapConverted : NewType, ImageWidth : )
 convert_map_type将输入Map转换为不同的映射类型。
 convert_map_type的主要用途是将最近邻居或双线性映射(例如,gen_image_to_world_plane_map生成的)转换为坐标映射,
 因为这是计算设备上支持的惟一类型。
 
 
 NewType指定转换的类型。支持以下值:
 'coord_map_sub_pix'
 创建一个由向量场图像组成的映射,其中包含每个像素映射的绝对子像素精度行和列坐标。
 (输入映射必须是“双线性”或“最近的邻居”)。
 
 
 bilinear
 创建具有线性坐标和双线性插值系数的映射(参见map_image)。(输入映射必须是'coord_map_sub_pix')
 
 
 nearest_neighbor
 创建一个线性坐标的最近邻居映射(参见map_image)。(输入映射必须是'coord_map_sub_pix')
 
 
 在ImageWidth中,必须给出要由mapconvert映射的图像的宽度。
 如果这个宽度与Map的宽度相同,则可以传递字符串“map_width”。
 
 
 
 
 例程:
 dev_close_window ()
 dev_open_window (0, 0, 768 / 2, 576 / 2, 'black', WindowHandle1)
 dev_update_off ()
 dev_set_draw ('margin')
 dev_set_line_width (2)
 * 标定相机
 CalTabDescrFile := 'caltab_big.descr'
 *确保文件CaltabName在当前工作目录HALCONROOT/calib directory内,或使得一个绝对路径
 StartCamPar := ['area_scan_division',0.008, 0, 0.0000086, 0.0000086, 384, 288, 768, 576]
 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_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
 *获取续写板位姿
 get_calib_data (CalibDataID, 'calib_obj_pose', [0,I - 1], 'pose', Pose)
 set_origin_pose (Pose, -1.125, -1.0, 0, PoseNewOrigin)
 * 生成映射图像
 gen_image_to_world_plane_map (MapSingle, CamParam, PoseNewOrigin, 768, 576, 900, 800, 0.0025, 'coord_map_sub_pix')
 concat_obj (Maps, MapSingle, Maps)
 endfor
 clear_calib_data (CalibDataID)
 stop()
 *映射图像
 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)
 convert_map_type(MapSingle, MapConverted, 'bilinear', 900)
 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
 
 
 
 
 
 
 |