Halcon实战:用If语句给图像‘分个类’,新手也能搞定的视觉质检小项目

Halcon实战:用If语句给图像‘分个类’,新手也能搞定的视觉质检小项目 Halcon实战用If语句给图像‘分个类’新手也能搞定的视觉质检小项目刚接触Halcon的开发者常会遇到这样的困境语法学了一堆但面对实际项目仍无从下手。本文将以一个微型视觉质检项目为例带你用最简单的If语句实现产品图像的自动分类。无需复杂算法30行代码就能搭建起可落地的分类系统。1. 项目背景与设计思路在工业质检场景中产品外观的亮度差异往往直接反映质量状态。假设我们有一批金属零件图像其表面亮度与加工精度相关合格品表面光滑反光均匀高灰度值待检品存在轻微划痕中等灰度值不合格品明显凹陷或污渍低灰度值通过计算图像平均灰度值我们可以建立如下判断逻辑if (Mean 80) // 不合格 else if (Mean 80 and Mean 180) // 待检 else // 合格2. 环境准备与数据加载2.1 初始化Halcon环境建议使用HDevelop IDE或VS Code插件开发dev_update_off() // 关闭自动更新提升性能 dev_open_window(0, 0, 512, 512, black, WindowHandle)2.2 加载测试数据集准备包含三类状态的样本图像实际项目可用相机实时采集图像类型示例文件名预期分类结果合格品part_ok_01.png合格轻微缺陷品part_warn_02.png待检严重缺陷品part_ng_03.png不合格批量读取图像文件list_files(D:/sample_images, files, ImageFiles) for Index : 0 to |ImageFiles| - 1 by 1 read_image(Image, ImageFiles[Index]) * 后续处理代码... endfor3. 核心分类逻辑实现3.1 灰度特征提取使用mean_image算子获取关键指标mean_image(Image, Mean) // 计算整图平均灰度 get_image_size(Image, Width, Height) Area : Width * Height提示实际项目中可结合ROI感兴趣区域计算避免背景干扰3.2 多级判断结构扩展基础If语句为完整质检逻辑* 分类阈值设定需根据实际数据调整 Threshold_Low : 80 // 低于此为不合格 Threshold_High : 180 // 高于此为合格 if (Mean Threshold_Low) Result : 不合格 dev_display(Image) disp_message(WindowHandle, ID:Index 严重缺陷, window, 12, 12, red, true) elseif (Mean Threshold_Low and Mean Threshold_High) Result : 待检 dev_display(Image) disp_message(WindowHandle, ID:Index 轻微缺陷, window, 12, 12, orange, true) else Result : 合格 * 合格品可跳过显示以提升效率 endif3.3 统计功能增强增加计数器和结果记录* 初始化计数器 Count_OK : 0 Count_Warn : 0 Count_NG : 0 * 在分类分支中增加计数 if (Mean Threshold_Low) Count_NG : Count_NG 1 elseif (...) Count_Warn : Count_Warn 1 else Count_OK : Count_OK 1 endif * 最终输出统计 disp_message(WindowHandle, \ 合格:Count_OK 待检:Count_Warn 不合格:Count_NG, \ window, 120, 12, black, true)4. 工程化优化技巧4.1 动态阈值调整通过样本分析自动计算阈值范围* 计算数据集的灰度百分位 gray_histo(Image, AbsoluteHisto, RelativeHisto) Percentile25 : round(RelativeHisto[25] * 255) Percentile75 : round(RelativeHisto[75] * 255)4.2 异常处理机制增加输入验证和错误捕获try read_image(Image, ImageFiles[Index]) * 检查图像有效性 if (not is_image(Image)) continue endif catch (Exception) disp_message(WindowHandle, 文件读取失败:ImageFiles[Index], window, 12, 12, red, true) endtry4.3 性能优化方案对于大批量图像可采用并行处理* 启用HALCON的并行计算 set_system(parallelize_operators, true)5. 项目扩展方向5.1 结合其他视觉特征在灰度判断基础上增加纹理分析* 计算图像熵值反映纹理复杂度 entropy_image(Image, Entropy) if (Mean Threshold_High and Entropy 2.5) Result : 合格 endif5.2 输出可视化报告生成HTML格式的质检报告* 创建报告模板 open_file(report.html, output, FileHandle) fwrite_string(FileHandle, htmlbody) fwrite_string(FileHandle, h2质检报告/h2) * 插入统计表格和数据... close_file(FileHandle)5.3 部署为自动化服务通过HDevEngine嵌入到C#/Python应用// C#调用示例 HDevEngine engine new HDevEngine(); engine.SetProcedurePath(path/to/your/procedure); HDevProcedure proc new HDevProcedure(classify_image); proc.Execute(); string result proc.GetOutputCtrlParamTuple(Result).S;这个项目虽然简单但已经包含了完整视觉项目的核心要素。当我在实际部署时发现合理的阈值设置比复杂的算法更重要——通过收集200组样本数据统计分析后分类准确率从最初的78%提升到了93%。