题目:halcon进化日记-0730控制结构

作者:李黛色

功能:通过这些控制语句,可以灵活实现Halcon脚本的逻辑控制


开头思路:随便写的,反正就开始了。

程序是怎么运行的,

  1. 水流一直向前,轨迹,一条线,无分叉达终点叫做顺序结构。 ——特点,一次
  2. 水流一直向前,轨迹,分叉了,最后在终点汇合叫做选择结构、分支结构等。 ——特点,选择
  3. 水流一直向前,轨迹,重复流动,达到条件,循环语句,重复。 ——特点,重复

条件语句

根据条件的不同,程序执行不同的操作。

if ... endif :单分支判断。

语法结构:

if (条件表达式)

// 条件为真时执行的语句

else

// 条件为假时执行的语句

endif

if ... else ... endif :双分支判断。

语法:

if (条件1)

// 条件1为真时执行

else

// 其他情况执行

endif

if ... elseif ... else ... endif :多分支判断,支持嵌套。

if (条件1)

// 条件1为真时执行

elseif (条件2)

// 条件2为真时执行

else

// 其他情况执行

endif

循环语句

在一定条件下,重复执行,某部分操作。

for ... endfor :固定次数循环,支持 by 步长(如 for i :=   0 to 10 by 2 endfor )。

语法:

for 索引 := 起始值 to 结束值 by 步长

// 循环体

endfor

while ...   endwhile :条件循环,需手动修改循环变量,如 while (a   < 10) a := a + 1 endwhile 。

语法:

while (条件表达式)

// 循环体

endwhile

跳转与中断

break :立即跳出当前循环。

continue :跳过当前循环剩余代码,进入下一次迭代。

return :从函数返回结果。

switch :多路分支(Halcon 18.11+)

语法:

switch (表达式)

case 值1:

// 匹配值1时执行

break

case 值2:

// 匹配值2时执行

break

default:

// 默认情况

endswitch

注意

关键注意事项

  1. 语句结束符:Halcon每行代码不需要分号(;),直接换行。
  2. 逻辑运算符: ◦ 与:and(如 if (A>0 and B<10)) ◦ 或:or(如 if (X1 or Y2)) ◦ 非:not(如 if (not Condition))
  3. 调试输出:使用 dev_inspect_ctrl() 在HDevelop中打印信息。

通过这些控制语句,可以灵活实现Halcon脚本的逻辑控制。


实例

示例1:产品缺陷检测(条件语句)

产品缺陷检测(条件语句)
* 读取产品图像
read_image (Image, 'ic0')
* 阈值分割
threshold (Image, Region, 128, 255)
* 面积筛选
connection (Region, ConnectedRegions)
select_shape (ConnectedRegions, Defects, 'area', 'and', 50, 1000) * 条件判断:是否有缺陷
count_obj (Defects, Number)
if (Number > 0)
* 存在缺陷时执行
dev_display (Image)
dev_display (Defects)
set_color ('red')
disp_message ('产品不合格!缺陷数量:' + Number, 'window', 12, 12, 'red', 'true')
* 记录到日志文件
open_file ('defect_log.txt', 'append', FileHandle)
fwrite_string (FileHandle, '检测时间:' + date() + ' 缺陷数量:' + Number)
close_file (FileHandle)
else
* 无缺陷时执行
disp_message ('产品合格', 'window', 12, 12, 'green', 'true')
endif

示例2:读取多张图像(for循环)

示例2:多角度匹配(for循环)
* 初始化窗口
dev_close_window()
dev_open_window (0, 0, 512, 512, 'blue', WindowHandle) * 设置图像路径
ImagePath := 'D:/MVTec/docDATA/HALCON-24.11-Progress-Steady/examples/images/' // 替换为实际路径 * 循环读取并显示5张图像
for Index := 1 to 5 by 1
* 构建图像文件名
ImageName := ImagePath + 'image' + Index + '.png' * 读取图像
read_image(Image, ImageName)
* 显示图像
dev_display(Image)
* 显示图像编号
* disp_message(WindowHandle, '图像 ' + Index, 'window', 12, 12, 'black', 'true')
* 使用dev_disp_text显示图像编号
Text := '图像 ' + Index
dev_disp_text(Text, 'window', 12, 12, 'black', [], []) * 暂停1秒
wait_seconds(1)
endfor

示例3:实时检测系统(while循环)

示例3:实时检测系统(while循环)
* 初始化相机
open_framegrabber ('DirectShow', 1, 1, 0, 0, 0, 0, 'default', -1, 'default', -1, 'default', 'default', 'default', 0, -1, AcqHandle)
grab_image_start (AcqHandle, -1) * 主循环
while (true)
* 抓取图像
grab_image_async (Image, AcqHandle, -1) * 缺陷检测算法
threshold (Image, Region, 100, 255)
connection (Region, ConnectedRegions)
select_shape (ConnectedRegions, Defects, 'area', 'and', 50, 1000)
count_obj (Defects, NumDefects) * 根据缺陷数量处理
switch (NumDefects)
case 0:
disp_message ('状态:正常', 'window', 12, 12, 'green', 'true')
case 1:
disp_message ('警告:1个缺陷', 'window', 12, 12, 'yellow', 'true')
case 2:
disp_message ('警告:2个缺陷', 'window', 12, 12, 'orange', 'true')
default:
disp_message ('警报:' + NumDefects + '个缺陷!', 'window', 12, 12, 'red', 'true')
beep (1) // 发出警报声
endswitch * 按ESC键退出
get_mbutton (WindowHandle, Row, Column, Button)
if (Button == 4) // ESC键
break
endif
endwhile * 清理资源
close_framegrabber (AcqHandle)

示例4:多区域分析(break/continue)

示例4:多区域分析(break/continue)
* 读取PCB图像
read_image (PCB, 'pcb.jpg')
* 分割焊点
threshold (PCB, Regions, 100, 255)
connection (Regions, SolderPoints) * 遍历所有焊点
count_obj (SolderPoints, NumPoints)
for i := 1 to NumPoints by 1
select_obj (SolderPoints, CurrentPoint, i) * 跳过太小的区域
area_center (CurrentPoint, Area, Row, Column)
if (Area < 50)
continue // 跳过当前迭代
endif * 检查圆形度
circularity (CurrentPoint, Circularity)
if (Circularity < 0.8)
* 发现不良焊点立即报警
dev_display (PCB)
dev_display (CurrentPoint)
disp_message ('不良焊点 #' + i, 'window', Row, Column, 'red', 'true')
beep (3) // 长警报
break // 发现第一个不良焊点即停止检测
endif
endfor

示例5:多条件处理(elseif)

示例5:多条件处理(elseif)
* 瓶盖颜色检测
read_image (Bottle, 'bottle.jpg')
decompose3 (Bottle, R, G, B)
* 计算平均颜色
mean_gray (R, R, MeanR)
mean_gray (G, G, MeanG)
mean_gray (B, B, MeanB) * 根据颜色分类
if (MeanR > 200 and MeanG < 50 and MeanB < 50)
Type := '红色瓶盖'
set_color ('red')
elseif (MeanR < 50 and MeanG > 200 and MeanB < 50)
Type := '绿色瓶盖'
set_color ('green')
elseif (MeanR < 50 and MeanG < 50 and MeanB > 200)
Type := '蓝色瓶盖'
set_color ('blue')
else
Type := '未知颜色'
set_color ('yellow')
endif * 显示结果
dev_display (Bottle)
disp_message (Type, 'window', 12, 12, 'black', 'true')

控制语句常与 Halcon 的图像处理算子(如阈值分割、形状匹配、特征提取等)结合,构建完整的视觉检测系统。


参考文献

https://www.bilibili.com/opus/527178429239474630

https://baike.baidu.com/item/程序控制结构/22019284

总结:千锤万凿出深山

halcon_02_控制结构的更多相关文章

  1. PHP语法(三):控制结构(For循环/If/Switch/While)

    相关链接: PHP语法(一):基础和变量 PHP语法(二):数据类型.运算符和函数 PHP语法(三):控制结构(For循环/If/Switch/While) 本文我来总结几个PHP常用的控制结构,先来 ...

  2. Python 30分钟入门——数据类型 and 控制结构

    Python是一门脚本语言,我也久闻大名,但正真系统的接触学习是在去年(2013)年底到今年(2014)年初的时候.不得不说的是Python的官方文档相当齐全,如果你是在Windows上学习Pytho ...

  3. 学习scala03 控制结构

    scala拥有非常宽松的控制结构. if与while scala中的if和while几乎和java中的结构一模一样. //if语句 val a= ){ println(“”) }else{ print ...

  4. Lua 学习笔记(四)语句与控制结构

    一.赋值与多重赋值      赋值的基本含义是改变一个变量的值或table中字段的值.Lua中允许“多重赋值”,也就是同时为多个值赋予多个变量,每个变量之间以逗号分隔.      Lua会先对等号右边 ...

  5. Scala入门之控制结构

    package com.dtspark.scala.basics /** * Scala中的基本控制结构有顺序.条件和循环三种方式,这个其它的JVM语言是一致的,但是Scala也有一些高级的流程控制结 ...

  6. 【Java 基础篇】【第三课】表达式、控制结构

    这两天再看敏捷开发流程,我这个算是敏捷博客吗? 哈哈o(∩_∩)o package a.b; public class Three { static void Expression() { Syste ...

  7. scala中如何编写自定义的流程控制结构

    scala是一种函数式编程风格的语言,除了常见的if......else  ,for ,while等传统的流程控制结构,也可以自定义流程控制的控制结构. 再了解scala如何实现编写新的流程结构,我们 ...

  8. oracle PL/SQL(procedure language/SQL)程序设计--控制结构(if else )

    IF逻辑结构:IF-THEN-END IFIF-THEN-ELSE-END IFIF-THEN-ELSIF-END IF 语法 IF condition THEN  statements;[ELSIF ...

  9. TCL语言笔记:TCL中的控制结构命令

    一.引言 控制结构允许程序根据不同的状态.条件和参数来选择不同的处理和执行路径,从而使代码具有更强的灵活性.健壮性和可读性. Tcl 提供了 if.if/else.if/elseif.foreach. ...

  10. PHP学习心得(十)——控制结构

    if 结构是很多语言包括 PHP 在内最重要的特性之一,它允许按照条件执行代码片段. if 语句可以无限层地嵌套在其它 if 语句中,这给程序的不同部分的条件执行提供了充分的弹性. else 延伸了  ...

随机推荐

  1. SpringBoot2 可以使用 SolonMCP 开发 MCP(江湖救急)

    MCP 官方的 java-sdk 目前要求 java17+(直接使用 sdk 也比较复杂).Spring-AI(有 MCP 内容)也是要求 java17+. SpringBoot2 怎么办? 使用 S ...

  2. 干货分享:Dify中4种核心变量详解!

    在 Dify 工作流(Workflow 和 Chatflow)的实现中,"变量"做为最基础.最核心的组件发挥着不可或缺的作用,因为它承载了不同节点间数据传递的作用. 也就是说,我们 ...

  3. Manim实现旋转变色特效

    在数学动画的世界里,旋转与变色特效无疑是最能吸引观众眼球的元素之一. 今天,就让我们一起探索如何使用Manim框架来实现自定义的旋转变色特效吧! 1. 实现原理 Manim的动画魔法源于Animati ...

  4. python学习课后练习

    此次爬虫学习的资源是B站所找,具体如下:Python课程天花板,Python入门+Python爬虫+Python数据分析5天项目实操/Python基础,该课程留了课后练习,我把自己的代码和想法单独整成 ...

  5. 【Java并发编程】面试必备之线程池

    什么是线程池 是一种基于池化思想管理线程的工具. 池化技术:池化技术简单点来说,就是提前保存大量的资源,以备不时之需.比如我们的对象池,数据库连接池等. 线程池好处 我们为什么要使用线程池,直接new ...

  6. JIT 编译优化原理深度解析

    在 Java 高级程序员面试中,JIT(即时编译,Just-In-Time Compilation)作为提升程序执行效率的核心技术,是 JVM 原理模块的高频考点.本文从 JIT 架构设计.热点代码识 ...

  7. MySQL事务:工作原理与实用指南

    MySQL事务:工作原理与实用指南 在数据库操作中,事务是保证数据一致性的重要机制.本文将深入探讨 MySQL 事务的特性.隔离级别以及实际应用场景,帮助你更好地理解和使用事务. 一.什么是事务? 事 ...

  8. 大数据存储计算平台EasyMR:多集群统一管理助力企业高效运维

    随着全球企业进入数字化转型的快车道,数据已成为企业运营.决策和增长的核心驱动力.为了处理海量数据,同时应对数据处理的复杂性和确保系统的高可用性,企业往往选择部署多个Hadoop集群,这样的策略可以将生 ...

  9. Windows Server ServerManager.exe 应用程序错误 0xc0000135 ServerManager.exe 无法启用

    将 Windows Server  .NET Framework移除. IIS卸载后, Server Manager.exe.事件查看器等都无法正常开启. 解决方案: 在运行中,输入CMD,打开命令控 ...

  10. 查看 SQL Server 当前的连接数

    打开 SQL Server Management Studio(SSMS),连接到 SQL Server 实例. 在 SSMS 的"对象资源管理器"窗格中,展开服务器节点. 点击& ...