ball.hdev: Inspection of Ball Bonding-例程带完整注释

本文介绍了一种使用图像处理技术来检测球形绑定的方法。通过读取图像、阈值分割、形态学操作等步骤,实现了对球体的有效识别,并进一步测量了球体的直径。
* ball.hdev: Inspection of Ball Bonding

dev_update_window ('off') 

*dev_update_window( : : DisplayMode : )   此处关闭窗口更新

dev_close_window ()   

*dev_close_window( : : : )  关闭(当前)活动的图形窗口

dev_open_window (0, 0, 728, 512, 'black', WindowID)

*dev_open_window( : : Row, Column, Width, Height, Background : WindowHandle) 
打开一个新的图形窗口

read_image (Bond, 'die/die_03')
dev_display (Bond)

set_display_font (WindowID, 14, 'mono', 'true', 'false')

*set_display_font( : : WindowHandle, Size, Font, Bold, Slant : )

disp_continue_message (WindowID, 'black', 'true')

*disp_continue_message — This procedure displays 'Click 'Run' to continue' in the lower right corner of the screen.

stop ()
threshold (Bond, Bright, 100, 255)
shape_trans (Bright, Die, 'rectangle2')
dev_set_color ('green')
dev_set_line_width (3)
dev_set_draw ('margin')
dev_display (Die)
disp_continue_message (WindowID, 'black', 'true')
stop ()
reduce_domain (Bond, Die, DieGrey)
threshold (DieGrey, Wires, 0, 50)
fill_up_shape (Wires, WiresFilled, 'area', 1, 100)
dev_display (Bond)
dev_set_draw ('fill')
dev_set_color ('red')
dev_display (WiresFilled)
disp_continue_message (WindowID, 'black', 'true')
stop ()
opening_circle (WiresFilled, Balls, 15.5)  *开运算之后实际上是一个连通域,形态学或者二值化之后的实际上是一个连通域。
dev_set_color ('green')
dev_display (Balls)
disp_continue_message (WindowID, 'black', 'true')
stop ()
connection (Balls, SingleBalls)
select_shape (SingleBalls, IntermediateBalls, 'circularity', 'and', 0.85, 1.0)
sort_region (IntermediateBalls, FinalBalls, 'first_point', 'true', 'column')
dev_display (Bond)
dev_set_colored (12)
dev_display (FinalBalls)
disp_continue_message (WindowID, 'black', 'true')
stop ()
smallest_circle (FinalBalls, Row, Column, Radius)
NumBalls := |Radius|
Diameter := 2 * Radius
meanDiameter := sum(Diameter) / NumBalls
mimDiameter := min(Diameter)
dev_display (Bond)
disp_circle (WindowID, Row, Column, Radius)
dev_set_color ('white')
for i := 1 to NumBalls by 1
    if (fmod(i,2) == 1)
        disp_message (WindowID, 'D: ' + Diameter[i - 1], 'image', Row[i - 1] - 2.7 * Radius[i - 1], max([Column[i - 1] - 60,0]), 'white', 'false')
    else
        disp_message (WindowID, 'D: ' + Diameter[i - 1], 'image', Row[i - 1] + 1.2 * Radius[i - 1], max([Column[i - 1] - 60,0]), 'white', 'false')
    endif
endfor
* dump_window (WindowID, 'tiff_rgb', './ball')
dev_set_color ('green')
dev_update_window ('on')
disp_continue_message (WindowID, 'black', 'true')
stop ()
dev_close_window ()
<think>我们正在处理一个关于Halcon视觉库在C#中调用的技术问题。用户希望知道如何创建HDevProgram实例并加载.hdev文件。根据引用[1]中的代码片段,我们可以得知在C#中设置Halcon过程路径并加载程序的基本方法。 步骤分解: 1. 首先,我们需要引用HalconDotNet命名空间,因为HDevEngine是Halcon提供的一个用于执行HDevelop脚本的引擎。 2. 然后,我们需要创建HDevEngine的实例,并设置过程路径(即存放.hdev文件的目录)。 3. 接着,我们可以通过HDevEngine来加载指定的.hdev文件,创建HDevProgram实例。 4. 最后,我们可以执行程序中的过程(类似于函数)。 注意:引用[1]中展示了如何设置过程路径,但没有具体展示如何加载一个.hdev文件并创建HDevProgram实例。因此,我们将结合Halcon的官方文档和常见用法来补充。 具体代码示例: 首先,确保已经将HalconDotNet.dll添加到项目的引用中。 然后,在代码中: */ using HalconDotNet; public class HalconHelper { private HDevEngine myEngine; public HalconHelper(string hdevDirectory) { // 初始化HDevEngine myEngine = new HDevEngine(); // 设置HDev程序所在的目录 myEngine.SetProcedurePath(hdevDirectory); } // 加载一个HDev程序 public HDevProgram LoadProgram(string programName) { // 注意:programName是.hdev文件的完整路径,或者如果已经在过程路径中,则可以是相对路径 HDevProgram program = new HDevProgram(programName); return program; } // 调用程序中的某个过程(假设过程名为'my_procedure') public void ExecuteProcedure(HDevProgram program, string procedureName) { // 从程序中获取一个可执行的过程 HDevProcedure proc = new HDevProcedure(program, procedureName); // 创建过程调用实例 HDevProcedureCall procCall = new HDevProcedureCall(proc); // 执行过程 procCall.Execute(); } } /* 使用示例: 假设我们有一个.hdev文件,名为"example.hdev",里面定义了一个名为"main"的过程。 我们可以这样使用: string hdevPath = @"C:\MyHalconPrograms"; HalconHelper helper = new HalconHelper(hdevPath); HDevProgram program = helper.LoadProgram("example.hdev"); helper.ExecuteProcedure(program, "main"); 注意: 1. 在加载程序时,如果程序文件不在设置的路径中,或者程序有语法错误,会抛出异常。 2. 在调用过程时,需要确保过程名与.hdev文件中定义的过程名完全一致(包括大小写)。 另外,引用[2]中提到,Halcon例程(如rim.hdev)中会包含一些自定义函数(过程),我们可以通过上述方式调用这些过程。 引用[4]中展示了一个基于形状模板匹配的例程(pm_multiple_models.hdev),我们可以用同样的方式加载并调用其中的过程。 因此,用户可以根据需要加载不同的.hdev文件并调用其中的过程。 相关问题: 1. 如何处理Halcon引擎在加载.hdev文件时可能出现的异常? 2. 如何在C#中传递参数给HDevProcedureCall? 3. 如何获取HDevProcedureCall执行后的结果(输出参数)? 如果用户需要,我们可以进一步展开这些问题。</think>### 如何在C#中创建HDevProgram实例并加载.hdev文件 在C#中调用Halcon.hdev文件需要借助`HDevEngine`库,以下是具体步骤和代码示例: #### 1. **初始化HDevEngine引擎** ```csharp using HalconDotNet; // 创建HDevEngine实例 HDevEngine engine = new HDevEngine(); // 设置.hdev文件存放路径(关键步骤) string scriptPath = @"C:\YourProject\hdev_scripts"; engine.SetProcedurePath(scriptPath); // 引用[1] ``` #### 2. **加载.hdev文件并创建HDevProgram** ```csharp // 加载特定.hdev文件(无需扩展名) HDevProgram program = new HDevProgram("your_script_name"); // 示例:加载多模型匹配程序(引用[4]) HDevProgram multiModel = new HDevProgram("pm_multiple_models"); ``` #### 3. **调用程序中的函数** ```csharp // 创建程序调用实例 HDevProgramCall programCall = new HDevProgramCall(program); // 执行程序中的函数(假设函数名为main) programCall.Execute("main"); // 参数调用示例(引用[4]) HDevProcedureCall procCall = new HDevProcedureCall( new HDevProcedure(multiModel, "process_model") ); procCall.SetInputCtrlParamTuple("ModelIndex", 2); // 设置输入参数 procCall.Execute(); ``` #### 4. **完整示例代码** ```csharp public class HalconProcessor { private HDevEngine _engine; public HalconProcessor(string scriptDir) { _engine = new HDevEngine(); _engine.SetProcedurePath(scriptDir); // 设置脚本路径 } public void RunDetection(string scriptName) { using (HDevProgram program = new HDevProgram(scriptName)) using (HDevProgramCall call = new HDevProgramCall(program)) { call.Execute(); // 执行默认函数 // 获取输出结果 HTuple result = call.GetOutputCtrlParamTuple("Result"); } } } // 调用示例 var processor = new HalconProcessor(@"D:\halcon_scripts"); processor.RunDetection("optical_flow_bicycle"); // 引用[3] ``` #### 关键注意事项: 1. **路径设置** `SetProcedurePath()`必须指向.hdev文件所在目录,否则会报错找不到文件[^1]。 2. **文件命名规则** .hdev文件中定义的**函数名需与调用时完全一致**(区分大小写)[^2]。 3. **资源释放** `HDevProgram`和`HDevProgramCall`需使用`using`或手动释放,避免内存泄漏。 4. **参数传递** - 输入参数:`SetInputCtrlParamTuple()` - 输出参数:`GetOutputCtrlParamTuple()` > 提示:Halcon例程(如`rim.hdev`[^2]和`pm_multiple_models.hdev`[^4])通常包含完整的参数传递示例,建议参考官方示例代码结构。 --- ### 相关问题 1. **如何处理.hdev文件中的多级函数调用?** Halcon是否支持嵌套程序执行?如何管理调用栈? 2. **调试技巧** 如何在C#中捕获并解析Halcon引擎返回的错误信息? 3. **性能优化** 当需要同时加载多个.hdev文件时,如何优化内存占用和执行效率? 4. **跨平台兼容性** 相同的.hdev文件在HDevelop中运行正常,但在C#调用时报错,可能的原因有哪些? 5. **实时数据处理** 如何将摄像头采集的图像流实时传递给.hdev文件进行处理?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值