资讯详情

halcon real类型深度图转灰度图、转点云图、拟合平面和测量高度

dev_clear_window() dev_open_window (0, 0, 545, 400, 'black', WindowHandle) xResolution:=0.04 yResolution:=0.04

* Image Acquisition 01: Code generated by Image Acquisition 01 * list_files ('E:/SMT电容虚焊测高/12-3测试图, ['files','follow_links'], ImageFiles) * tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles) * for Index := 0 to |ImageFiles| - 1 by 1 * read_image (Image, ImageFiles[Index]) * Image Acquisition 01: Do something * endfor

read_image (Image, 'E:/SMT12-03-15-34-1555-155-155.tif') *第一步是提取带数据点的区域(tiff有些地方没有方没有数据) 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')  *生成一个ROI该区域用于拟合平面 gen_rectangle1 (ROI_0, 510, 1300, 670, 1460) get_region_points (ROI_0, Rows, Columns) *将行列坐标乘以相应的分辨率转换为实际X和Y xTuple:=Rows*xResolution yTuple:=Columns*yResolution zTuple:=[] *获取Z方向的实际值 get_grayval_interpolated (Image, Rows, Columns, 'bilinear', zTuple) *根据xyz拟合三维平面 fit_3d_plane_xyz (xTuple, yTuple, zTuple, Ox, Oy, Oz, Nx, Ny, Nz, MeanResidual)
*另一种思路 *xyz三通道深度图 get_image_size (Image, Width, Height) *生成xy坐标图像映射乘以分辨率xy的相对值 gen_image_surface_first_order (ImageSurface, 'real', 1, 0, 0, 0, 0, Width, Height) gen_image_surface_first_order (ImageSurface1, 'real', 0, 1, 0, 0, 0, Width, Height) scale_image (ImageSurface, X, xResolution, 0) scale_image (ImageSurface1, Y, yResolution, 0) compose3 (X, Y, Image, MultiChannelImage) xyz_to_object_model_3d (X, Y, Image, ObjectModel3D) *选择区域内的点Min, Max代表高阈值 select_points_object_model_3d (ObjectModel3D, 'point_coord_z', Min, Max, ObjectModel3DThresholded) prepare_object_model_3d (ObjectModel3DThresholded, 'segmentation', 'true', [], []) *visualize_object_model_3d (WindowHandle, ObjectModel3DThresholded, [], [], [], [], [], [], [], PoseOut) reduce_domain (X, ROI_0, XImageReduced) reduce_domain (Y, ROI_0, YImageReduced) reduce_domain (Image, ROI_0, ZImageReduced) xyz_to_object_model_3d (XImageReduced, YImageReduced, ZImageReduced, 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)
*寻找ROI,并求ROI指向平面距离的峰值 threshold (ImageConverted, Region1, 180, 220) connection (Region1, ConnectedRegions) select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 2000, 5000) count_obj (SelectedRegions, Number) dev_display (Image) dev_display (SelectedRegions) *中心点按各区域计算,沿长轴方向按一定距离生成ROI *声明数组保存生成ROI峰值点高度差 resTuple:=[] distance:=30 *寻找生成遍历区域ROI的中心点 for Index := 1 to Number by 1   select_obj (SelectedRegions, ObjectSelected, Index)   *获取电容的中心点   area_center (ObjectSelected, Area, Row, Column)   *计算电容和水平方向的夹角   orientation_region (ObjectSelected, Phi)   *了解区域中心点和中心点之间的距离   *找出自动生成区域的中心点   tanx:=sin(Phi)/cos(Phi)   roiX1:=Row (distance*tanx/sqrt(1 (tanx*tanx)))   roiX2:=Row-(distance*tanx/sqrt(1 (tanx*tanx)))   roiY1:=Column (distance/sqrt(1 (tanx*tanx)))   roiY2:=Column-(distance/sqrt(1 (tanx*tanx)))   *生成ROI,在区域内获得点坐标x:rows,y:columns,z:深度图高度   gen_rectangle2 (Rectangle1, roiX1, roiY1, Phi, 2, 2)   get_region_points (Rectangle1, Rows1, Columns1)   get_grayval_interpolated (X, Rows1, Columns1, 'bilinear', resX1Tuple)   get_grayval_interpolated (Y, Rows1, Columns1, 'bilinear', resY1Tuple)   get_grayval_interpolated (Image, Rows1, Columns1, 'bilinear', resZ1Tuple)   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   endfor   *区域2,同区域1的处理方法   gen_rectangle2 (Rectangle2, roiX2, roiY2, Phi, 2, 2)   get_region_points (Rectangle2, Rows2, Columns2)   get_grayval_interpolated (X, Rows2, Columns2, 'bilinear', resX2Tuple)   get_grayval_interpolated (Y, Rows2, Columns2, 'bilinear', resY2Tuple)   get_grayval_interpolted (Image, Rows2, Columns2, 'bilinear', resZ2Tuple)
     for Index2 := 0 to |resX2Tuple|-1 by 1
         *计算点到平面上一点的向量和平面法向量的点乘
         temp:=(resX2Tuple[Index2]-Ox)*Nx+(resY2Tuple[Index2]-Oy)*Ny+(resZ2Tuple[Index2]-Oz)*Nz
         *法向量的模
         D:=sqrt(Nx*Nx+Ny*Ny+Nz*Nz)
         res2Tuple[Index2]:=temp/D
     endfor
     *求区域里面的均值
     *tuple_mean (res1Tuple, Mean)
     *求区域里面的峰值
     tuple_sort (res1Tuple, Sorted1)
     if (|res1Tuple|>10)
         tuple_select_range (Sorted1, |res1Tuple|-6, |res1Tuple|-1, Sorted11)
         tuple_mean (Sorted11, Mean1)
     else
         tuple_mean (res1Tuple, Mean1)
     endif
     *区域2
     tuple_sort (res2Tuple, Sorted2)
     if (|res2Tuple|>10)
         tuple_select_range (Sorted2, |res2Tuple|-6, |res2Tuple|-1, Sorted22)
         tuple_mean (Sorted22, Mean2)
     else
         tuple_mean (res2Tuple, Mean2)
     endif
     resTuple[Index]:=abs(Mean2-Mean1)
endfor

函数:

fit_3d_plane_xyz (xTuple, yTuple, zTuple, Ox, Oy, Oz, Nx, Ny, Nz, MeanResidual)

Ox := []
Oy := []
Oz := []
Nx := []
Ny := []
Nz := []
MeanResidual := []
Size := |X|
if (Size < 3 or Size != |Y| or Size != |Z|)
    return ()
endif
tuple_mean (X, Ox)
tuple_mean (Y, Oy)
tuple_mean (Z, Oz)
create_matrix (3, |X|, [X - Ox,Y - Oy,Z - Oz], MatrixID_Mt)
transpose_matrix (MatrixID_Mt, MatrixID_M)
svd_matrix (MatrixID_M, 'reduced', 'right', MatrixID_U, MatrixID_S, MatrixID_V)
get_value_matrix (MatrixID_S, [0,1,2], [0,1,2], SingularvaluesOfM)
tuple_sort_index (SingularvaluesOfM, Indices)
if (SingularvaluesOfM[Indices[0]] < 1e-9 and SingularvaluesOfM[Indices[1]] < 1e-9)
    return ()
endif
get_value_matrix (MatrixID_V, [0,1,2], [Indices[0],Indices[0],Indices[0]], N)
create_matrix (3, 1, N, MatrixID_N)
Nx := N[0]
Ny := N[1]
Nz := N[2]
mult_matrix (MatrixID_M, MatrixID_N, 'AB', MatrixID_MN)
get_full_matrix (MatrixID_MN, Distances)
Distances := abs(Distances)
MeanResidual := sum(Distances) / Size
clear_matrix ([MatrixID_MN,MatrixID_N,MatrixID_V,MatrixID_S,MatrixID_U,MatrixID_M,MatrixID_Mt])
return ()

标签: 3d1电容

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台