工控编程吧

标题: 工业视觉halcon map_image函数介绍 [打印本页]

作者: qq263946146    时间: 2019-6-8 17:32
标题: 工业视觉halcon map_image函数介绍
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

[halcon]1[/halcon]








欢迎光临 工控编程吧 (https://www.gkbc8.com/) Powered by Discuz! X3.4