当前位置: 首页 > news >正文

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),便于显示。

http://www.xdnf.cn/news/568873.html

相关文章:

  • 掌握HTTPX:从基础到高并发工程实践
  • 自由开发者计划 001:创建一个用于查看 Jupyter Notebook 的谷歌浏览器插件
  • FPGA降低功耗研究
  • 【76. 最小覆盖子串】
  • 操作系统 第四章 -2
  • Docker安装MinIO对象存储中间件
  • 图片识别(TransFormerCNNMLP)
  • 分享一些多模态文档解析思路
  • 蓝桥杯3503 更小的数
  • polarctf-web-[某函数的复仇]
  • 基于python的机器学习(七)—— 数据特征选择
  • PostgreSQL中通过查询数据插入到表的几种方法( SELECT INTO和INSERT INTO ... SELECT)
  • uniapp+vue3 随机、换一批
  • anaconda创建环境出错HTTPS
  • Captiks动捕与步态分析步态分析系统MOVIT:16μs 无线同步 + 快速校准,破解传统光电困局
  • 集成 OpenTelemetry + Grafana:实现 ABP VNext 的全链路可观测性
  • API面临哪些风险,如何做好API安全?
  • vue+threeJs 创建千色三角形宇宙
  • spring-retry
  • Pandoc3.7新特性:存在合并单元格的 HTML 表格会被保留为嵌入的 HTML 表格
  • WordPress Elementor零基础教程
  • 【Redis8】最新安装版与手动运行版
  • 电商项目-商品微服务-规格参数管理,分类与品牌管理需求分析
  • FFmpeg中使用Android Content协议打开文件设备
  • 免费的DDOS防护对网站业务有用吗?
  • 电子电路:什么是寄生电容?
  • 迅为RK3568开发板Linux_NVR_SDK系统开发编译 rootfs 提示分区小
  • 以太坊ETH创建代币完整教程
  • 2025.05.21华为暑期实习机考真题解析第一题
  • html,js获取扫码设备的输入内容