Halcon 3D检测平面度,断差,凹坑,凸点

Halcon可以利用深度图做相关检测,也可以直接利用点云数据做检测。但是如果是利用点云数据进行检测,PCL更合适。本文写的是利用深度图检测的方法。

dev_close_window ()
dev_open_window (0, 0, 512, 512, ‘black’, WindowHandle)
dev_set_draw (‘margin’)
X,Y,Z轴的分辨率
XResolution:=0.03
YResolution:=0.03
ZResolution:=0.0002
0-65535是深度图的灰度值范围
32768是倾斜校正的加系数(可以理解为高度为0,水平面的高度)
read_image (InputImage, ‘imgTest.tiff’)
倾斜校正,生成校正后的图像OutputImage,把倾斜平面矫正到水平面,进行后续的3D测量
*********
绘制基准区域(需要被测量的区域,做倾斜矫正)
gen_rectangle1 (ROI_0, 183.411, 410.389, 242.444, 432.361)
gen_rectangle1 (ROI_1, 419.544, 414.783, 478.577, 432.361)
concat_obj (ROI_0, ROI_1, RegionInput)
union1 (RegionInput,RegionSurface)
保留死角区域,避免受影响
threshold (InputImage, Region, 0, 0)
get_image_size (InputImage, Width, Height)
根据输入区域进行平面拟合,输出起算面信息(X倾斜、Y倾斜和Z截距)
fit_surface_first_order (RegionSurface, InputImage, ‘huber’, 5, 1, Alpha, Beta, Gamma)
根据X倾斜、Y倾斜,计算平面与水平面夹角

tuple_sqrt(AlphaAlpha + BetaBeta,AlphaBeta)
tuple_atan ((ZResolution*AlphaBeta)/XResolution, Rad)
tuple_cos(Rad, Cos)
*****根据X倾斜、Y倾斜创建基准面图像(纯平面)
area_center (RegionSurface,Area, CenterRow, CenterColumn)
gen_image_surface_first_order(ImageSurface, ‘uint2’, Alpha, Beta, Gamma, CenterRow, CenterColumn, Width, Height)
*****原始图像与基准面作差,并根据与水平面夹角进行高度修正,并在结果上加32768,即校正后零的灰度值为32768)
sub_image (InputImage, ImageSurface, OutputImage, Cos, 32768)
将无效数据区域数值重新置零
overpaint_region(OutputImage,Region,0,‘fill’)


3D测量代码*************************
测量两个平面间的高度差(断差)***********************
gen_rectangle1 (plan1, 178.87, 379.627, 230.335, 463.123)
gen_rectangle1 (plan2, 306.019, 407.459, 357.483, 445.545)
intensity (plan1, OutputImage, Mean, Deviation)
intensity (plan2, OutputImage, Mean1, Deviation1)
HeightDifference:=abs(Mean-Mean1)ZResolution
测量单个平面上的凸点和凹坑
先计算基准高度
gen_circle (plan3, 341.839, 418.171, 13.1093)
intensity (plan3, OutputImage, Mean2, Deviation2)
找高于基准0.1mm的凸点和低于基准0.1mm的凹坑
TuDian_Offset:=0.1/ZResolution
AoKeng_Offset:=-0.1/ZResolution
gen_circle (RegionTest, 330.237, 422.107, 84.9124)
reduce_domain (OutputImage, RegionTest, ImageReduced)
通过与基准高度的偏差参数,找凸点和凹坑
threshold (ImageReduced, Region1, Mean2+TuDian_Offset, 999999999)
threshold (ImageReduced, Region2, 0, Mean2+AoKeng_Offset)
测量单个平面的平面度
********************
gen_ellipse (plan4, 336.292, 423.572, rad(90), 142.285, 101.387)
gen_circle (plan5, 336.292, 425.037, 58.6328)
difference (plan4, plan5, RegionDifference)
*缩放图像的灰度值到mm,3D重建,并显示(如果深度图的灰度信息已经是mm,则不需要缩放)
scale_image (OutputImage, ImgScal, ZResolution, 0)
convert_image_type (ImgScal, zMap, ‘real’)
gen_image_surface_first_order (xMap, ‘real’, 0, XResolution, 0, 0, 0, Width, Height)
gen_image_surface_first_order (yMap, ‘real’, YResolution, 0, 0, 0, 0, Width, Height)
xyz_to_object_model_3d (xMap, yMap, zMap, ObjectModel3D)
visualize_object_model_3d (WindowHandle, ObjectModel3D, [], [],
[‘lut’,‘color_attrib’,‘disp_pose’],
[‘color1’,‘coord_z’,‘true’], [], [], [], PoseOut)

*裁切出需要检测平面度的区域,并利用点云计算平面度
reduce_object_model_3d_by_view (RegionDifference, ObjectModel3D, [], [], ObjectModel3DReduced)
*把3D图元拟合到3D点集中(plane类型是平面,算法least_squares_tukey是最小二乘法)
paraName:=[‘primitive_type’,‘fitting_algorithm’]
paraVal:=[‘plane’,‘least_squares_tukey’]
fit_primitives_object_model_3d (ObjectModel3DReduced, paraName, paraVal, planeFitted)
*计算平面度
distance_object_model_3d (ObjectModel3DReduced, planeFitted, [], 0, [], [])
get_object_model_3d_params (ObjectModel3DReduced, ‘&distance’, pointsDis)
flatness:=abs(max(pointsDis)-min(pointsDis))

Hi~ 可私信我了解后再进行下载~ 本资源上传时,遗漏了两个文件,分别是:data_filter_keep_order_output_index.hdvp 以及 IntensityImageToPiontsCloudImage.hdvp,购买了该资源的同学,给我留言,我会私信发给你们。 1.基于halcon算法平台; 2.提供深图源文件以及解压密码; 3.代码预览: */****************************** * @文档名称: 基于云的平面测量。 * @作者: hugo * @版本: 1.1 * @日期: 2021-6-20 * @描述: 该方法支持云的平面平面测量。 ********************************/ dev_update_window ('on') dev_get_window (WindowHandle) read_image (imageReal, './replay_38893_2021-6-7.tif') xResolution:=0.06 yResolution:=0.06 zResolution:=0.001 ScaleFactor:=[xResolution,yResolution,zResolution] *采样区域1 create_drawing_object_rectangle2 (300, 120, rad(90), 30, 20, DrawID) set_drawing_object_params (DrawID, 'color', 'forest green') set_drawing_object_params (DrawID, 'line_width', 1) attach_drawing_object_to_window (WindowHandle, DrawID) .......... *平面 height:=theta/zScale*0.001 *可视化高效果 visParamName := ['lut','alpha_0','intensity','color_1'] visParamValue := ['hsi',0.7,'coord_z','yellow'] Labels := ['','平面:'+height+'mm',''] objs:=[ObjectModel3Ds[2],final_ObjectModel3Ds] visualize_object_model_3d (WindowHandle, objs, [], [], visParamName, visParamValue, 'Edited by AmazingRobot+', [Labels], '', PoseOut) *stop () clear_object_model_3d (plane_balls) for Index := 0 to |final_ObjectModel3Ds|-1 by 1 clear_object_model_3d (final_ObjectModel3Ds[Index]) endfor return () 谢谢您的信任~
### Halcon3D 云曲率计算方法 在 Halcon 中,对于 3D 云数据的处理提供了多种工具和技术来实现曲率计算。为了有效地执行这些操作,通常会先对云进行预处理以提高后续分析的质量。 #### 预处理阶段 通过 `reduce_domain` 函数可以裁剪掉不需要的部分,保留感兴趣的区域;利用 `smooth_point_cloud` 可减少噪声影响并平滑表面[^1]: ```cpp * Preprocessing the point cloud data to reduce noise. gen_surface_normal (Pointcloud, NormalX, NormalY, NormalZ) smooth_point_cloud (Pointcloud, SmoothedPointCloud, 'gaussian', 0.5) ``` #### 曲率估计算法 针对具体应用场景可以选择不同类型的局部邻域模型来进行曲率估算。一种常用的方法是在每一个采样周围构建最小二乘拟合平面,并基于此求解主方向及其对应的特征值作为衡量标准之一。Halcon 提供了专门用于此类任务的操作符 `estimate_curvature`: ```cpp * Estimating curvatures at each point within the smoothed point cloud. estimate_curvature (SmoothedPointCloud, CurvatureValues, MethodType) ``` 这里 `MethodType` 参数决定了采用何种方式去近似几何属性,例如 `'paraboloid'`, `'quadric'` 或者其他更复杂的形状描述子。 #### 结果展示与交互式探索 完成上述步骤之后便可以获得整个三维物体表面上每一处的主要弯曲程信息。为了便于观察理解,可借助于图形化界面组件如 `dev_display` 来绘制颜色映射图谱表示不同程下的变化趋势: ```cpp * Visualizing curvature values on a color-coded map overlaid onto original points. get_image_size (Image, Width, Height) dev_open_window_fit_image (Image, 0, 0, Width, Height, WindowHandle) set_shape_color ('red') disp_obj (CurvedSurfaceModel, WindowHandle) * Optionally add scalar field visualization for better insight into local geometry features. create_scalar_field_from_z_buffer (WindowHandle, ScalarFieldID) add_icon_to_scalar_field (ScalarFieldID, IconPath) display_scalar_field (ScalarFieldID, MinValue, MaxValue, ColorMapName) ``` 以上代码片段展示了如何使用 Halcon 的函数库来进行基本的 3D 云集曲率评估以及直观呈现最终成果的方式。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值