genicamtl_lmi_gocator_objectmodel3d
目录
- 一、在halcon中找不到genicamtl_lmi_gocator_objectmodel3d例程
- 二、在halcon中运行genicamtl_lmi_gocator_objectmodel3d,该如何配置
- 三、代码分段详解(一)传感器连接
- 四、代码分段详解(二)采集图像并显示
- 五、代码分段详解(三)坐标变换
- 六、常见问题
一、在halcon中找不到genicamtl_lmi_gocator_objectmodel3d例程
重新运行halcon安装软件,选择对应的安装包即可。
二、在halcon中运行genicamtl_lmi_gocator_objectmodel3d,该如何配置
1、任务栏搜索环境变量
2、添加下图所示环境变量,点击确认。
三、代码分段详解(一)传感器连接
1、查找’GenICamTL’协议支持的设备信息,选择 'Gocator’传感器
2、打开传感器
3、设置显示参数
dev_update_window ('off')info_framegrabber ('GenICamTL', 'info_boards', Information, ValueList)
tuple_regexp_select (ValueList, 'Gocator', Device)
open_framegrabber ('GenICamTL', 0, 0, 0, 0, 0, 0, 'progressive', 16, 'rgb', -1, 'false', 'default', Device, 0, -1, AcqHandle)
ConfigFile := ''
if (ConfigFile != '')Go2GenTL_SetConfigFileName (AcqHandle, ConfigFile)
endif
get_framegrabber_param (AcqHandle, 'image_width', Width)
get_framegrabber_param (AcqHandle, 'image_height', Height)
DisplayHeight := 600
DisplayWidth := DisplayHeight * Width / Height
四、代码分段详解(二)采集图像并显示
1、采集图像:grab_image (Image, AcqHandle)
2、图像数据解析:Go2GenTL_ParseData
3、分别显示HeightMap和IntensityScaled
while (true)display_waiting_message ()* grab the imagetrygrab_image (Image, AcqHandle)catch (Exception)continueendtrydev_close_window ()dev_open_window (0, 0, DisplayWidth, DisplayHeight, 'black', WindowID1)dev_open_window (0, DisplayWidth + 5, DisplayWidth, DisplayHeight, 'black', WindowID2)Go2GenTL_ParseData (Image, HeightMap, Intensity, frameCount, timestamp, encoderPosition, encoderIndex, inputs, xOffset, xResolution, yOffset, yResolution, zOffset, zResolution, width, height, HasIntensity)dev_set_window (WindowID1)dev_display (HeightMap)dev_disp_text('HeightMap', 'window', 10, 10, 'black', [], [])dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'right', 'black', [], [])if (HasIntensity)scale_image (Intensity, IntensityScaled, 1.0 / 256, 0)dev_set_window (WindowID2)dev_display (IntensityScaled)dev_disp_text('Intensity', 'window', 10, 10, 'black', [], [])endifstop ()dev_close_window ()dev_close_window ()
endwhile
五、代码分段详解(三)坐标变换
1、创建以m为单位的X和Y图像
xResolution:X方向分辨率,这里用的是nm单位,如果有疑问查看Gocator 文档
yResolution:y方向分辨率,这里用的是nm单位
Units := 1e-9,最后把坐标变成m单位
gen_image_surface_first_order( : ImageSurface : Type, Alpha, Beta, Gamma, Row, Column, Width, Height : )
gen_image_surface_first_order (X, 'real', 0, xResolution * Units, xOffset * Units, 0, 0, Width, Height)
gen_image_surface_first_order (Y, 'real', yResolution * Units, 0, yOffset * Units, 0, 0, Width, Height)
ImageSurface(r,c) = Alpha(r - Row) +Beta(c - Column) +Gamma
X=xResolution * Units * (Px - Column) + xOffset * Units
Y=yResolution * Units * (Py - Row) + yOffset * Units
2、gocator坐标变换到halcon坐标
scale_image (Z, Z, zResolution * (-1.0 * Units), (StandOff +zOffsetTransform_signed) * Units - zOffset * Units)
Z= zResolution * (-1.0 * Units)* Z + (StandOff +zOffsetTransform_signed) * Units - zOffset * Units)
其中:
zResolution * (-1.0 * Units):将传感器数据缩放到米单位,负号实现坐标系方向翻转
(StandOff + zOffsetTransform_signed) * Units:基准距离补偿
zOffset * Units:额外偏移修正
3、生成三维模型并显示:xyz_to_object_model_3d
while (true)* Calculate the real-world coordinates (X, Y, Z) from pixel* coordinates (Px, Py, Pz):* X = X-offset + Px * X-Resolution* Y = Y-offset + Py * Y-Resolution* Z = Z-offset + Pz * Z-ResolutionUnits := 1e-9gen_image_surface_first_order (X, 'real', 0, xResolution * Units, xOffset * Units, 0, 0, Width, Height)gen_image_surface_first_order (Y, 'real', yResolution * Units, 0, yOffset * Units, 0, 0, Width, Height)* Create Z image with correct scaling (in [m]) and set HALCON camera 3D* coordinate system:* Xhalcon = Xgocator* Yhalcon = Ygocator* Zhalcon = StandOff + zOffsetTransform - Zgocator* where: StandOff = ClearanceDistance + (MeasurementRange/2)* * Reduce domain: 0 value means invalid datathreshold (HeightMap, Region, 1, lsh(1,16) - 1)reduce_domain (HeightMap, Region, ImageReduced)convert_image_type (ImageReduced, Z, 'real')Go2GenTL_Transformation (AcqHandle, xOffsetTransform, zOffsetTransform, AngleTransform, OrientationTransform, StandOff)* Transformation values in [um]* The uint4 values have to be interpreted as int4if (zOffsetTransform > lsh(1,31))zOffsetTransform_signed := zOffsetTransform - lsh(1,32)elsezOffsetTransform_signed := zOffsetTransformendifscale_image (Z, Z, zResolution * (-1.0 * Units), (StandOff + zOffsetTransform_signed) * Units - zOffset * Units)* * Generate an ObjectModel3D and visualize it, press button* to continuexyz_to_object_model_3d (X, Y, Z, ObjectModel3D)dev_open_window (0, 0, 800, 600, 'black', WindowID1)set_display_font (WindowID1, 16, 'mono', 'true', 'false')get_object_model_3d_params (ObjectModel3D, 'num_points', NumPoints)if (NumPoints > 0)VisPose := []Instructions[0] := 'Rotate: Left button'Instructions[1] := 'Zoom: Shift + left button'Instructions[2] := 'Move: Ctrl + left button'visualize_object_model_3d (WindowID1, ObjectModel3D, [], VisPose, ['color_attrib','lut'], ['coord_z','rainbow'], 'ObjectModel3D', [], Instructions, PoseOut)* * Visualize using the intensity dataif (HasIntensity)get_region_points (Z, Rows, Columns)get_grayval (IntensityScaled, Rows, Columns, Grayval)set_object_model_3d_attrib_mod (ObjectModel3D, '&intensity', 'points', Grayval)visualize_object_model_3d (WindowID1, ObjectModel3D, [], VisPose, ['color_attrib','lut'], ['&intensity','sqrt'], 'ObjectModel3D with Amplitude', [], Instructions, PoseOut)endifelsedev_disp_text('No 3D points in the 3D object model!', 'window', 250, 200, 'black', [], [])stop ()endif
endwhile
*
close_framegrabber (AcqHandle)
dev_update_window ('on')
六、常见问题
1、为什么需要Offset?
校准补偿:传感器安装位置可能与理论坐标系存在物理偏移。
多传感器拼接:在多个传感器协同工作时,Offset用于对齐不同传感器的数据。
2、Resolution如何确定?
出厂标定:由传感器制造商提供(例如激光线间距)。
软件配置:通过Gocator配置文件(.cfg)设定扫描范围和分辨率。
3、 为什么要过滤Z=0的点?
无效数据:传感器可能无法测量某些区域(如反光表面或阴影),此时HeightMap返回0值,需忽略。
4、强度图为何要除以256?
数据缩放:假设原始强度数据是16位(0-65535),除以256后缩放到8位(0-255),便于显示。