* ***********************************************************************

* This example program shows how to use the operator

* segment_object_model_3d in HALCON. First, the 2.5D

* input image is segmented. Additionally, with the same

* operator, a fitting is performed. The result of the

* 3D segmentation is converted to a region and is

* displayed. Finally, the values of the fitted radii

* for the cylinders and spheres are visualized.

* 首先,分割2.5D输入图像,转化为适当的3D Model,

* 并分割成sub Models(segment_object_model_3d),sub Models转化为区域并显示。

* 最终,圆柱形和球形标示半径并图形化显示。

* ***********************************************************************

dev_update_off ()

dev_close_window ()

* Input: 2.5D image

* 读取:2.5D图像

read_image (XYZ, '3d_machine_vision/segmentation/3d_primitives_xyz_01.tif')

dev_open_window_fit_image (XYZ, 0, 0, -1, -1, WindowHandle)

set_display_font (WindowHandle, 16, 'mono', 'true', 'false')

* Access to (x-, y-, z-)coordinates

* 读取(X,Y,Z)坐标通道数据

access_channel (XYZ, X, 1)

access_channel (XYZ, Y, 2)

access_channel (XYZ, Z, 3)

*

Message := 'Generate a 3D object model from an'

Message[1] := 'XYZ image and segment primitives'

Message[2] := '(spheres, cylinders, planes) in it:'

dev_display (Z)

disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')

disp_continue_message (WindowHandle, 'black', 'true')

stop ()

* Prepare the segmentation

* 准备分割

xyz_to_object_model_3d (X, Y, Z, ObjectModel3DID)

prepare_object_model_3d (ObjectModel3DID, 'segmentation', 'false', 'max_area_holes', 100)

ParSegmentation := ['max_orientation_diff','max_curvature_diff','output_xyz_mapping','min_area']

ValSegmentation := [0.13,0.11,'true',150]

ParFitting := ['primitive_type','fitting_algorithm']

ValFitting := ['all','least_squares_huber']

* Segmentation and fitting is done in one step,

* because the parameter 'fitting' is set to 'true' by default

* 分割和适应性一步完成

* 因为参数'fitting' 默认设置为'true'

segment_object_model_3d (ObjectModel3DID, [ParSegmentation,ParFitting], \

[ValSegmentation,ValFitting], ObjectModel3DOutID)

* Clear the object model that is no longer used.

clear_object_model_3d (ObjectModel3DID)

* Show the result of the segmentation

* 显示分割结果

dev_set_colored (12)

for Index := 0 to |ObjectModel3DOutID| - 1 by 1

object_model_3d_to_xyz (XTmp, YTmp, ZTmp, ObjectModel3DOutID[Index], 'from_xyz_map', [], [])

get_domain (ZTmp, DomainTmp)

if (Index == 0)

copy_obj (DomainTmp, Domain, 1, 1)

else

concat_obj (Domain, DomainTmp, Domain)

endif

endfor

dev_display (Domain)

disp_message (WindowHandle, '3D Segmentation', 'window', 12, 12, 'black', 'true')

disp_message (WindowHandle, 'Segmented objects: ' + |ObjectModel3DOutID|, 'window', 40, 12, 'black', 'true')

disp_continue_message (WindowHandle, 'black', 'true')

stop ()

* Show the result of the fitting

dev_clear_window ()

* 外部函数

#dev_display_fitting_results (RegionCylinder, RegionSphere, RegionPlane, RegionNone, \

#                            ObjectModel3DOutID, WindowHandle, [])

* This procedure displays the results of a fitting operation.

* Additionally to the primitive regions, the radius of

* cylinders and spheres is displayed.

* The colors can be specified with the parameter Colors

* in the following manner:

* Color[0] is used for objects which could not be fitted

* Color[1] is used for cylinders

* Color[2] is used for spheres

* Color[3] is used for planes

*

Colors := ['dim gray','forest green','red','slate blue']

NumNone := 0

NumCylinders := 0

NumSpheres := 0

NumPlanes := 0

for Index := 0 to |ObjectModel3DOutID| - 1 by 1

object_model_3d_to_xyz (XTmp, YTmp, ZTmp, ObjectModel3DOutID[Index], 'from_xyz_map', [], [])

get_domain (XTmp, DomainTmp)

get_object_model_3d_params(ObjectModel3DOutID[Index], 'has_primitive_data', ParamValue)

if (ParamValue == 'true')

get_object_model_3d_params(ObjectModel3DOutID[Index], 'primitive_parameter', GenParamValuesP)

get_object_model_3d_params(ObjectModel3DOutID[Index], 'primitive_type', ParamValue)

if (ParamValue == 'cylinder')

if (NumCylinders == 0)

copy_obj (DomainTmp, RegionCylinder, 1, -1)

RadiusCylinder := GenParamValuesP[6]

else

concat_obj (RegionCylinder, DomainTmp, RegionCylinder)

RadiusCylinder := [RadiusCylinder,GenParamValuesP[6]]

endif

NumCylinders := NumCylinders + 1

elseif (ParamValue == 'sphere')

if (NumSpheres == 0)

copy_obj (DomainTmp, RegionSphere, 1, -1)

RadiusSphere := GenParamValuesP[3]

else

concat_obj (RegionSphere, DomainTmp, RegionSphere)

RadiusSphere := [RadiusSphere,GenParamValuesP[3]]

endif

NumSpheres := NumSpheres + 1

else

if (NumPlanes == 0)

copy_obj (DomainTmp, RegionPlane, 1, -1)

else

concat_obj (RegionPlane, DomainTmp, RegionPlane)

endif

NumPlanes := NumPlanes + 1

endif

else

if (NumNone == 0)

copy_obj (DomainTmp, RegionNone, 1, -1)

else

concat_obj (RegionNone, DomainTmp, RegionNone)

endif

NumNone := NumNone + 1

endif

endfor

*

NumColors := |Colors|

if (NumNone > 0)

dev_set_color (Colors[0 % NumColors])

dev_display (RegionNone)

endif

if (NumCylinders > 0)

dev_set_color (Colors[1 % NumColors])

dev_display (RegionCylinder)

endif

if (NumSpheres > 0)

dev_set_color (Colors[2 % NumColors])

dev_display (RegionSphere)

endif

if (NumPlanes > 0)

dev_set_color (Colors[3 % NumColors])

dev_display (RegionPlane)

endif

disp_message (WindowHandle, '3D Fitting', 'window', -1, -1, 'black', 'true')

Message := 'Cylinders: ' + NumCylinders

Message[1] := 'Spheres: ' + NumSpheres

Message[2] := 'Planes: ' + NumPlanes

Message[3] := 'Undefined: ' + NumNone

disp_message (WindowHandle, Message, 'window', 40, 12, 'black', 'true')

if (NumCylinders > 0)

* Display radius for each cylinder

area_center (RegionCylinder, Area, Row, Column)

for Index := 0 to NumCylinders - 1 by 1

Radius := int(RadiusCylinder[Index] * 1000)

disp_message (WindowHandle, 'Cylinder\nr = ' + Radius + ' mm', 'image', Row[Index], Column[Index], 'white', 'false')

endfor

endif

if (NumSpheres > 0)

* Display radius for each cylinder sphere

area_center (RegionSphere, Area, Row, Column)

for Index := 0 to NumSpheres - 1 by 1

Radius := int(RadiusSphere[Index] * 1000)

disp_message (WindowHandle, 'Sphere\nr = ' + Radius + ' mm', 'image', Row[Index], Column[Index], 'white', 'false')

endfor

endif

* Example code, if further inspections should be made:

*

* Store only the data of the primitive to save memory

for Index := 0 to |ObjectModel3DOutID| - 1 by 1

* Copy only the data of the primitive

copy_object_model_3d (ObjectModel3DOutID[Index], 'primitives_all', CopiedObjectModel3DID)

* Clear the object model that is no longer used.

clear_object_model_3d (ObjectModel3DOutID[Index])

* Further inspections

* .....

* .....

* Clear the copied model after applying further inspections

clear_object_model_3d (CopiedObjectModel3DID)

endfor

dev_update_on ()

segment_object_model_3d的更多相关文章

随机推荐

  1. Invalid bound statement (not found)错误的可能原因

    其他原因导致此问题解决参考: 1.检查xml文件所在package名称是否和Mapper interface所在的包名 <mapper namespace="me.tspace.pm. ...

  2. HDU 6153 A Secret(扩展kmp)

    A Secret Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 256000/256000 K (Java/Others)Total ...

  3. 利用javascript:void(0)制作假的提交按钮替代button

    在写html页面,我们很自然的在表单提交的地方采用button来作为提交按钮,但是,用<button type=”button”>按钮</button>作为提交代码会有个问题, ...

  4. Beta阶段第2周/共2周 Scrum立会报告+燃尽图 14

    作业要求[https://edu.cnblogs.com/campus/nenu/2018fall/homework/2411] 版本控制:https://git.coding.net/liuyy08 ...

  5. Django——ContentType(与多个表建立外键关系)及ContentType-signals的使用

    一.ContentType 在django中,有一个记录了项目中所有model元数据的表,就是ContentType,表中一条记录对应着一个存在的model,所以可以通过一个ContentType表的 ...

  6. 关于EPoll的个人理解

    1.epoll 是I/o多路复用的一种解决方案,对比select的优点有: a.支持打开最大的文件描述符(可高达百万) b.效率并不随着描述符的增多而线性下降.select每次是轮询,所以描述符越多效 ...

  7. [linux]df 磁盘100%Used告警,du显示目录状态良好的故障排查

    1.回顾: 某在线主机深夜连续接到告警系统的disk Used 超限告警. 登陆主机查看却遇到了困惑:在检查磁盘使用量 df –h 出来的磁盘使用量确实和告警信息一样,已经被100%占用,但是查看目录 ...

  8. 中南林业科技大学第十一届程序设计大赛- I:背包问题

    链接:https://www.nowcoder.com/acm/contest/124/I来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒空间限制:C/C++ 131072K,其他语言26214 ...

  9. python3 openpyxl基本操作

    #coding:utf-8 import xlrd import xlwt # 读写2007 excel import openpyxl import sys #读取设备sn # def readSN ...

  10. LoadRunner安装+破解+汉化

    安装 一.需要准备的东东: 1.电脑的操作系统:Win7旗舰版(不解释,这个版本安装问题最少了) 2.LoadRunner11+破解文件+汉化文件+删除注册表工具 3.强大的搜索引擎 二.安装过程 用 ...