halcon_02_控制结构

题目: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

总结:千锤万凿出深山

相关推荐
Tianwen_Burning8 天前
change_domain与reduce_domain
halcon
格林威18 天前
Baumer相机最新SDK开发_下载_封装
人工智能·数码相机·opencv·机器学习·计算机视觉·视觉检测·halcon
kylezhao201921 天前
Halcon 自带案例(Create_mode_green_dot)讲解
图像处理·人工智能·halcon
格林威24 天前
传送带上运动模糊图像复原:提升动态成像清晰度的 6 个核心方案,附 OpenCV+Halcon 实战代码!
人工智能·opencv·机器学习·计算机视觉·ai·halcon·工业相机
Chris_121925 天前
Halcon学习笔记-Day6:工业视觉高级技术应用与实战项目
笔记·学习·halcon
Chris_121925 天前
Halcon学习笔记-Day6进阶:工业级视觉系统核心技术详解
人工智能·python·深度学习·halcon
Chris_12191 个月前
Halcon学习笔记-Day5
人工智能·笔记·python·学习·机器学习·halcon
【ql君】qlexcel1 个月前
机器视觉软件介绍:opencv、halcon、康耐视visionpro、海康visionmaster
人工智能·opencv·计算机视觉·halcon·visionmaster·visionpro
code bean1 个月前
【Halcon】Halcon模板匹配技术深度解析:形状匹配 vs 局部可形变匹配
c#·halcon
zxy28472253011 个月前
利用C#的视觉库Halcon识别药盒多条形码,可用于追溯码识别(二)
c#·halcon·条码·追溯码·多条码