dev_clear_window() dev_open_window (0, 0, 545, 400, 'black', WindowHandle) xResolution:=0.04 yResolution:=0.04 read_image (Image, 'E:/SMT电容虚焊测高/电容虚焊测高/电容虚焊测高/电容虚焊测高/电容虚焊测高/电容虚焊测高/电容虚焊测高/Test_Pic/12-3测试图/12-03-15-34-58-155.tif') *未滤波的深度图转化为灰度图 threshold (Image, Region, 0, 20) min_max_gray (Region, Image, 0, Min, Max, Range) *基于深度图的最大和最小值,将深度图转换为灰度图 scale_image_range (Image, ImageScaled, Min, Max) convert_image_type (ImageScaled, ImageConverted, 'byte') *本来想通过对单通道real类型的图片采用中值、均值和高斯等传统手段的滤波方式 *但是过滤后的所有图片都没有数据 *所以只能用halcon过滤三维工具 *第一步将深度图转换为3D模型 *首先生成x、y方向映射坐标 get_image_size (Image, Width, Height) gen_image_surface_first_order (xImageSurface, 'real', 1, 0, 0, 0, 0, Width, Height) gen_image_surface_first_order (yImageSurface, 'real', 0, 1, 0, 0, 0, Width, Height) scale_image (xImageSurface, xImageScaled, xResolution, 0) scale_image (yImageSurface, yImageScaled, yResolution, 0) *将三张图片合成到三个通道中是没有实际用途的 compose3 (xImageScaled, yImageScaled, Image, MultiChannelImage) *直接通过三张图生成3D模型 xyz_to_object_model_3d (xImageScaled, yImageScaled, Image, ObjectModel3D) dev_display (ImageConverted) gen_rectangle1 (ROI_0, 400, 1250, 700, 1550) reduce_domain (xImageScaled, ROI_0, xImageReduced) xyz_to_object_model_3d (xImageReduced, yImageScaled, Image, ObjectModel3D1) fit_primitives_object_model_3d (ObjectModel3D1, ['primitive_type','fitting_algorithm'], ['plane','least_squares_tukey'], ObjectModel3DOut) get_object_model_3d_params (ObjectModel3DOut, 'primitive_parameter', ParamValue) get_object_model_3d_params (ObjectModel3DOut, 'primitive_rms', ParamValue4) *平面法向量n n:=[ParamValue[0],ParamValue[1],ParamValue[2]] z:=[0,0,1] *两者的余弦值 costheta:=ParamValue[2]/(sqrt(ParamValue[0]*ParamValue[0] ParamValue[1]*ParamValue[1] ParamValue[2]*ParamValue[2])) scale_image (Image, HeightcorrectionImage, costheta, 0) *校正后,获得一个区域的高信息 get_region_points (ROI_0, Rows, Columns) get_grayval_interpolated (HeightcorrectionImage, Rows, Columns, 'bilinear', Grayval) get_grayval_interpolated (Image, Rows, Columns, 'bilinear', Grayval1) *直接求距离 get_grayval_interpolated (xImageScaled, Rows, Columns, 'bilinear', resX1Tuple) get_grayval_interpolated (yImageScaled, Rows, Columns, 'bilinear', resY1Tuple) get_grayval_interpolated (Image, Rows, Columns, 'bilinear', resZ1Tuple) count_seconds(S1) fit_3d_plane_xyz (resX1Tuple, resY1Tuple, resZ1Tuple, Ox, Oy, Oz, Nx, Ny, Nz, MeanResidual) gen_image_const (xImage1, 'real', Width, Height) gen_image_proto (xImage1, xImageCleared, Ox) sub_image (xImageScaled, xImageCleared, xImageSub, Nx, 0) gen_image_const (yImage1, 'real', Width, Height) gen_image_proto (yImage1, yImageCleared, Oy) sub_image (yImageScaled, yImageCleared, yImageSub, Ny, 0) gen_image_const (zImage1, 'real', Width, Height) gen_image_proto (zImage1, zImageCleared, Oz) sub_image (Image, zImageCleared, zImageSub, Nz, 0) add_image (xImageSub, yImageSub, ImageTemp, 1, 0) add_image (ImageTemp, zImageSub, ImageResult, 1, Oz) count_seconds(S2) Time := S2-S1 *取一个区域的点,与矫正后的图片对比,求点到平面的距离 for Index1 := 0 to |resX1Tuple|-1 by 1 *计算点乘以平面上的一点向量和平面法向量 temp:=(resX1Tuple[Index1]-Ox)*Nx (resY1Tuple[Index1]-Oy)*Ny (resZ1Tuple[Index1]-Oz)*Nz *法向量的模 D:=sqrt(Nx*Nx Ny*Ny Nz*Nz) res1Tuple[Index1]:=(temp/D) Oz endfor
不加Oz点云矫正