************************************************************** This example program shows how to use the operators
* connection_object_model_3d and select_object_model_3d
* in HALCON. First, a threshold is applied to the 3D object
* model. Then, the connected components are calculated
* based on the geometric distance. Finally, the connected
* components are selected by their volume and diameter and
* the result is displayed.**************************************************************dev_update_off()dev_close_window()* Load X,Y,Z-Data, scale them to meter and generate a 3D object model
ImagePath :='time_of_flight/'read_image(Image, ImagePath +'engine_cover_xyz_01')* 缩放图片灰度值
scale_image(Image, Image,.001,.0)* 缩放图像
zoom_image_factor(Image, Image,2,2,'constant')decompose3(Image, X, Y, Z)* 将图像中的 3D 点转换为 3D 物体模型
xyz_to_object_model_3d(X, Y, Z, ObjectModel3DID)* Compute a mesh(Delauney triangulation) of the model
* 准备3D模型
prepare_object_model_3d(ObjectModel3DID,'segmentation','true',[],[])** Prepare the visualization and display the 3D object model
* 创建位姿
create_pose(0.058,-0.165,0.660,345.0,355.0,356.0,'Rp+T','gba','point', Pose)** Instructions for visualize_object_model_3d
Instructions[0]:='Rotate: Left button'
Instructions[1]:='Zoom: Shift + left button'
Instructions[2]:='Move: Ctrl + left button'* Configuration
gen_cam_par_area_scan_division(0.01,0,7e-6,7e-6,352,288,710,576, CamParam)
GenParamName :=['color','disp_pose','alpha']
GenParamValue :=['green','false',0.8]*dev_open_window(0,0,710,576,'black', WindowHandle)set_display_font(WindowHandle,16,'mono','true','false')*visualize_object_model_3d(WindowHandle, ObjectModel3DID, CamParam, Pose, GenParamName, GenParamValue,'This scene will be segmented into single objects',[], Instructions, Pose)** Threshold the 3D object Model
MinValue :=0.500
MaxValue :=0.670* 筛选映射到坐标z轴上的最大最小值点
select_points_object_model_3d(ObjectModel3DID,'point_coord_z', MinValue, MaxValue, ObjectModel3DIDReduced)visualize_object_model_3d(WindowHandle, ObjectModel3DIDReduced, CamParam, Pose, GenParamName, GenParamValue,'Result after thresholding at z='+(MaxValue *1e3)$'.3'+'mm from the camera',[], Instructions, Pose)** Calculate the connected components and the volume and diameter
* of each of the resulting object
GenParamName[0]:='colored'
GenParamValue[0]:=12* 分割
connection_object_model_3d(ObjectModel3DIDReduced,'distance_3d',0.010, ObjectModel3DIDConnections)* 计算3D模型的体积
volume_object_model_3d_relative_to_plane(ObjectModel3DIDConnections,[0,0,MaxValue,0,0,0,0],'signed','true', Volume)* 计算3D 模型的最大直径
max_diameter_object_model_3d(ObjectModel3DIDConnections, Diameter)** Display the results
dev_open_window(0,720,400,576,'black', WindowHandle1)set_display_font(WindowHandle1,14,'mono','true','false')
Indices :=[0:|ObjectModel3DIDConnections|-1]disp_message(WindowHandle1,['Features of the connected components:',' ',' '],'window',12,12,'white','false')
ResultMessage :=' # Max. diameter Volume'
Sequence :=[0:|ObjectModel3DIDConnections|-1]
ResultMessage :=[ResultMessage,Sequence$' 3'+' '+(Diameter *1e3)$'7.1f'+' mm '+(Volume *1e3)$'7.3f'+' dm³']disp_message(WindowHandle1, ResultMessage,'window',50,12,'white','false')dev_set_window(WindowHandle)visualize_object_model_3d(WindowHandle, ObjectModel3DIDConnections, CamParam, Pose, GenParamName, GenParamValue,'Found '+|ObjectModel3DIDConnections|+' connected components','#'+ Indices, Instructions, Pose)** Select components by their volume and maximal diameter
*
MinVolume :=0.35e-003
MaxVolume :=1.0e-003
MinDiameter :=185.0e-003
MaxDiameter :=300.0e-003**** Attention:* select_object_model_3d uses the plane [0,0,0,0,0,0]*for the volume calculation! Therefore we have
* to transform the 3d object models, so that the
* reference plane(as defined in the former call to
* volume_object_model_3d_relative_to_plane) coincides to the
*default plane.* 仿射运算
hom_mat3d_identity(HomMat3DIdentity)hom_mat3d_translate(HomMat3DIdentity,0,0,-MaxValue, HomMat3DTranslation)hom_mat3d_invert(HomMat3DTranslation, HomMat3DInvert)affine_trans_object_model_3d(ObjectModel3DIDConnections, HomMat3DTranslation, ObjectModel3DTranslated)* Set a label for each part
* 设置标签
for Index :=0 to |ObjectModel3DIDConnections|-1 by 1set_object_model_3d_attrib_mod(ObjectModel3DTranslated[Index],'&Index',[], Index)
endfor
** 计算仿射运算后的体积
volume_object_model_3d_relative_to_plane(ObjectModel3DTranslated,[0,0,0,0,0,0,0],'signed','true', Volume1)* 通过体积何最大直径进行筛选
select_object_model_3d(ObjectModel3DTranslated,['volume','diameter_object'],'and',[MinVolume,MinDiameter],[MaxVolume,MaxDiameter], ObjectModel3DSelected)*
Title :=['Parts selected by using the following features: ',' '+(MinVolume *1e3)$'3.1f'+' dm³ <= volume <= '+(MaxVolume *1e3)$'3.1f'+' dm³','and: '+(MinDiameter *1e3)$'.1f'+' mm <= max. diameter <= '+(MaxDiameter *1e3)$'.1f'+' mm']* Create the labels
Label :=[]for Index :=0 to |ObjectModel3DSelected|-1 by 1*获取参数get_object_model_3d_params(ObjectModel3DSelected[Index],'&Index', FormerIndex)Label :=[Label,'#'+ FormerIndex]
endfor
*if(|ObjectModel3DSelected|>1)visualize_object_model_3d(WindowHandle, ObjectModel3DSelected, CamParam,[], GenParamName, GenParamValue, Title, Label, Instructions, Pose)elseMessage :='No object left after using the following features: 'Message[1]:=' '+(MinVolume *1e3)$'3.1f'+' dm³ <= volume <= '+(MaxVolume *1e3)$'3.1f'+' dm³'Message[2]:='and: '+(MinDiameter *1e3)$'.1f'+' mm <= max. diameter <= '+(MaxDiameter *1e3)$'.1f'+' mm'disp_message(WindowHandle, Message,'window',12,12,'black','true')
endif
** Clear the 3d object models
dev_set_window(WindowHandle1)dev_close_window()clear_object_model_3d([ObjectModel3DID,ObjectModel3DIDReduced,ObjectModel3DSelected,ObjectModel3DTranslated,ObjectModel3DIDConnections])