找回密码
 立即注册
首页 业界区 业界 halcon_02_控制结构

halcon_02_控制结构

墨佳美 2025-9-26 11:45:23
题目:halcon进化日记-0730控制结构
作者:李黛色
功能:通过这些控制语句,可以灵活实现Halcon脚本的逻辑控制
开头思路:随便写的,反正就开始了。
程序是怎么运行的,

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

根据条件的不同,程序执行不同的操作。
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
注意

关键注意事项
<ol>语句结束符:Halcon每行代码不需要分号(;),直接换行。
逻辑运算符: ◦ 与:and(如 if (A>0 and B 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[/code]示例2:读取多张图像(for循环)

示例2:多角度匹配(for循环)
  1. * 读取产品图像
  2. read_image (Image, 'ic0')
  3. * 阈值分割
  4. threshold (Image, Region, 128, 255)
  5. * 面积筛选
  6. connection (Region, ConnectedRegions)
  7. select_shape (ConnectedRegions, Defects, 'area', 'and', 50, 1000)
  8. * 条件判断:是否有缺陷
  9. count_obj (Defects, Number)
  10. if (Number > 0)
  11.     * 存在缺陷时执行
  12.     dev_display (Image)
  13.     dev_display (Defects)
  14.     set_color ('red')
  15.     disp_message ('产品不合格!缺陷数量:' + Number, 'window', 12, 12, 'red', 'true')
  16.     * 记录到日志文件
  17.     open_file ('defect_log.txt', 'append', FileHandle)
  18.     fwrite_string (FileHandle, '检测时间:' + date() + ' 缺陷数量:' + Number)
  19.     close_file (FileHandle)
  20. else
  21.     * 无缺陷时执行
  22.     disp_message ('产品合格', 'window', 12, 12, 'green', 'true')
  23. endif
复制代码
示例3:实时检测系统(while循环)

示例3:实时检测系统(while循环)
  1. * 初始化窗口
  2. dev_close_window()
  3. dev_open_window (0, 0, 512, 512, 'blue', WindowHandle)
  4. * 设置图像路径
  5. ImagePath := 'D:/MVTec/docDATA/HALCON-24.11-Progress-Steady/examples/images/'  // 替换为实际路径
  6. * 循环读取并显示5张图像
  7. for Index := 1 to 5 by 1
  8.     * 构建图像文件名
  9.     ImageName := ImagePath + 'image' + Index + '.png'
  10.    
  11.     * 读取图像
  12.     read_image(Image, ImageName)
  13.     * 显示图像
  14.     dev_display(Image)
  15.     * 显示图像编号
  16. *     disp_message(WindowHandle, '图像 ' + Index, 'window', 12, 12, 'black', 'true')
  17.         * 使用dev_disp_text显示图像编号
  18.     Text := '图像 ' + Index
  19.     dev_disp_text(Text, 'window', 12, 12, 'black', [], [])
  20.    
  21.     * 暂停1秒
  22.     wait_seconds(1)
  23. endfor
复制代码
示例4:多区域分析(break/continue)

示例4:多区域分析(break/continue)
  1. * 初始化相机
  2. open_framegrabber ('DirectShow', 1, 1, 0, 0, 0, 0, 'default', -1, 'default', -1, 'default', 'default', 'default', 0, -1, AcqHandle)
  3. grab_image_start (AcqHandle, -1)
  4. * 主循环
  5. while (true)
  6.     * 抓取图像
  7.     grab_image_async (Image, AcqHandle, -1)
  8.    
  9.     * 缺陷检测算法
  10.     threshold (Image, Region, 100, 255)
  11.     connection (Region, ConnectedRegions)
  12.     select_shape (ConnectedRegions, Defects, 'area', 'and', 50, 1000)
  13.     count_obj (Defects, NumDefects)
  14.    
  15.     * 根据缺陷数量处理
  16.     switch (NumDefects)
  17.     case 0:
  18.         disp_message ('状态:正常', 'window', 12, 12, 'green', 'true')
  19.     case 1:
  20.         disp_message ('警告:1个缺陷', 'window', 12, 12, 'yellow', 'true')
  21.     case 2:
  22.         disp_message ('警告:2个缺陷', 'window', 12, 12, 'orange', 'true')
  23.     default:
  24.         disp_message ('警报:' + NumDefects + '个缺陷!', 'window', 12, 12, 'red', 'true')
  25.         beep (1)  // 发出警报声
  26.     endswitch
  27.    
  28.     * 按ESC键退出
  29.     get_mbutton (WindowHandle, Row, Column, Button)
  30.     if (Button == 4)  // ESC键
  31.         break
  32.     endif
  33. endwhile
  34. * 清理资源
  35. close_framegrabber (AcqHandle)
复制代码
示例5:多条件处理(elseif)

示例5:多条件处理(elseif)
  1. * 读取PCB图像
  2. read_image (PCB, 'pcb.jpg')
  3. * 分割焊点
  4. threshold (PCB, Regions, 100, 255)
  5. connection (Regions, SolderPoints)
  6. * 遍历所有焊点
  7. count_obj (SolderPoints, NumPoints)
  8. for i := 1 to NumPoints by 1
  9.     select_obj (SolderPoints, CurrentPoint, i)
  10.    
  11.     * 跳过太小的区域
  12.     area_center (CurrentPoint, Area, Row, Column)
  13.     if (Area < 50)
  14.         continue  // 跳过当前迭代
  15.     endif
  16.    
  17.     * 检查圆形度
  18.     circularity (CurrentPoint, Circularity)
  19.     if (Circularity < 0.8)
  20.         * 发现不良焊点立即报警
  21.         dev_display (PCB)
  22.         dev_display (CurrentPoint)
  23.         disp_message ('不良焊点 #' + i, 'window', Row, Column, 'red', 'true')
  24.         beep (3)  // 长警报
  25.         break    // 发现第一个不良焊点即停止检测
  26.     endif
  27. endfor
复制代码
控制语句常与 Halcon 的图像处理算子(如阈值分割、形状匹配、特征提取等)结合,构建完整的视觉检测系统。
参考文献

https://www.bilibili.com/opus/527178429239474630
https://baike.baidu.com/item/程序控制结构/22019284
总结:千锤万凿出深山

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册