康耐视 VisionPro 彩色排线顺序检测实战分享
摘要: 本文分享一个基于 Cognex VisionPro 的彩色排线(Flat Cable)颜色顺序检测方案。针对 7 芯排线(红、白、黑、橙、黄、绿、蓝),利用 CogColorExtractorTool 结合 CogPMAlignTool 完成单根芯线定位,再通过 CogToolBlock 脚本对 7 路结果进行逻辑排序判定,最终输出 OK/NG。文章适合 VisionPro 初学者入门参考。
一、项目背景与需求
在消费电子、汽车线束等行业,彩色排线的颜色顺序直接决定了接口定义是否正确。人工目检效率低、易疲劳,因此需要视觉系统实现自动化防错。
本案例检测对象: 7 芯彩色排线
标准顺序(从左到右): 红 → 白 → 黑 → 橙 → 黄 → 绿 → 蓝
检测目标: 判断当前排线颜色顺序是否与标准一致,若错位则输出 NG。
二、整体方案设计
2.1 架构思路
由于需要识别 7 种不同颜色并判断其空间顺序,我采用了 “7 路并行检测 + ToolBlock 集中判定” 的架构:

2.2 工具链选型
| 颜色提取 | CogColorExtractorTool | 将目标颜色从彩色图像中分割出来,生成灰度图 |
| 精确定位 | CogPMAlignTool | 在灰度图上搜索芯线图案,输出中心坐标 TranslationX |
| 单路标注 | CogCreateGraphicLabelTool | 在对应芯线上方绘制颜色文字标签 |
| 逻辑判定 | CogToolBlock | 执行 C# 脚本,比较 7 个 X 坐标顺序 |
| 结果输出 | CogCreateGraphicLabelTool | 显示最终的 OK/NG 大字 |
三、单路颜色检测实现
每一根芯线的检测逻辑都是相同的,只是训练的模板和提取的颜色不同。下面以红色通道为例进行说明。
3.1 ColorExtractor 提取颜色区域
首先使用 CogColorExtractorTool 对输入彩色图像进行颜色过滤。通过设置目标颜色的阈值范围(Hue/Saturation/Lightness 或 RGB 空间),将红色区域高亮输出为灰度图,其余背景 suppressed。
- 输出 1:GreyscaleImage —— 供后续 PMAlign 搜索
- 输出 2:PixelCount —— 可用于后续扩展判断该颜色是否存在(本练习暂未使用)

3.2 PMAlign 精确定位
将 ColorExtractor 输出的灰度图接入 CogPMAlignTool。
为什么不用 ColorExtractor 直接算 centroid?
因为排线可能存在轻微旋转、伸缩或来料位置偏移,PMAlign 的模式匹配能够给出更鲁棒的中心坐标,同时兼具角度输出能力,为后续整体纠偏预留空间。
- 训练要点:在灰度图上框选单根芯线的稳定纹理区域训练模板。
- 关键输出:Results.Item[0].GetPose().TranslationX —— 即该颜色芯线在图像中的水平位置。
3.3 动态标签标注
为了让调试更直观,每个子流程末尾都挂了一个 CogCreateGraphicLabelTool:
- X、Y 坐标:直接绑定到本路 PMAlign 输出的 TranslationX、TranslationY,确保文字始终跟随在芯线上方。
- Text:直接写死为对应颜色名称(如“红色”)。
- 颜色:目前采用固定颜色显示(未做随排线颜色动态变色,初学者可先这样实现)。
重复以上步骤 7 次,分别建立红、白、黑、橙、黄、绿、蓝 7 个检测分支,得到 7 个 TranslationX。
四、ToolBlock 判定逻辑(核心)
4.1 数据汇总
将 7 路 PMAlign 的 TranslationX 全部接入一个 CogToolBlock 的输入端。在我的工程中,它们分别对应:
| Results_Item_0_GetPose_TranslationX | 红色 | 第 1 位 |
| Results_Item_0_GetPose_TranslationX1 | 白色 | 第 2 位 |
| Results_Item_0_GetPose_TranslationX2 | 黑色 | 第 3 位 |
| Results_Item_0_GetPose_TranslationX3 | 橙色 | 第 4 位 |
| Results_Item_0_GetPose_TranslationX4 | 黄色 | 第 5 位 |
| Results_Item_0_GetPose_TranslationX5 | 绿色 | 第 6 位 |
| Results_Item_0_GetPose_TranslationX6 | 蓝色 | 第 7 位 |
4.2 脚本代码
在 ToolBlock 的 C# 脚本中,我采用了最直接的大小比较逻辑(硬编码标准顺序)。因为排线从左到右水平放置,X 坐标越小越靠左,所以只要判断:
红 < 白 < 黑 < 橙 < 黄 < 绿 < 蓝
即顺序正确。
// CogToolBlock 脚本片段(简化示意)
if(Inputs.Results_Item_0_GetPose_TranslationX < Inputs.Results_Item_0_GetPose_TranslationX1
&& Inputs.Results_Item_0_GetPose_TranslationX1 < Inputs.Results_Item_0_GetPose_TranslationX2
&& Inputs.Results_Item_0_GetPose_TranslationX2 < Inputs.Results_Item_0_GetPose_TranslationX3
&& Inputs.Results_Item_0_GetPose_TranslationX3 < Inputs.Results_Item_0_GetPose_TranslationX4
&& Inputs.Results_Item_0_GetPose_TranslationX4 < Inputs.Results_Item_0_GetPose_TranslationX5
&& Inputs.Results_Item_0_GetPose_TranslationX5 < Inputs.Results_Item_0_GetPose_TranslationX6)
{
Outputs.Output = "OK";
}
else
{
Outputs.Output = "NG";
}
4.3 结果输出
将 ToolBlock 的 Output 字符串绑定到主界面的 CogCreateGraphicLabelTool,即可在图像右侧显示醒目的 NG 或 OK。

五、位置纠偏与旋转适应
实际产线上,排线来料不可能完全水平或固定在同一位置。本方案通过以下方式兼容一定范围内的位置偏移和角度旋转:
这种“先提取颜色、再独立匹配”的方式,比直接用一个灰度工具找所有线束更抗干扰,因为颜色信息已经将 7 根线预先区分开了。
六、运行效果展示
6.1 NG 样例(顺序正确)
下图为一张典型的 OK 样例。正确顺序应为“红、白、黑、橙、黄、绿、蓝”,,系统正确输出了 OK 红色大字,并在每根线上方标注了当前识别到的颜色名称。

6.2 单路检测细节
下图展示了“红色”单路检测的内部细节:ColorExtractor 提取红色区域后,PMAlign 精确定位,并将“红色”标签贴在对应位置。

七、总结与后续可优化点
7.1 方案优点
- 逻辑简单直观:7 路颜色并行提取 + 坐标排序,非常适合 VisionPro 初学者理解 ToolGroup 和 ToolBlock 的配合。
- 可视化强:每根芯线都有颜色标签和最终 NG/OK 显示,调试方便。
- 一定鲁棒性:利用 PMAlign 的角度搜索兼容了来料旋转和位置偏移。
7.2 当前局限(初学者练习版)
作为个人练习项目,当前版本为了先跑通流程,做了以下简化,读者后续可按需升级:
| 未做缺失检测 | 若某根芯线断线或未拍到,ToolBlock 里仍会比较固定输入,可能误判。后续可加入 PixelCount 或 PMAlign Score 判断是否存在。 |
| 未做乱序具体诊断 | 目前只知道“NG”,不知道是哪两根线 swapped。后续可在脚本中做数组排序,输出具体错位信息。 |
| 标准顺序硬编码 | 当前红<白<黑<橙<黄<绿<蓝写死在脚本里。后续可通过 ToolBlock 输入参数或外部配方(Recipe)实现不同机种切换。 |
| 标签颜色固定 | 可让标签字体颜色跟随排线实际颜色,显示更直观。 |
八、结语
本文通过一个完整的 VisionPro 彩色排线顺序检测案例,展示了 ColorExtractorTool、PMAlignTool 与 CogToolBlock 脚本的基础配合方式。虽然脚本逻辑很“新手向”,但已经能满足基础的顺序防错需求。希望这篇分享能给刚入门 VisionPro 的朋友提供一个可复现的练手项目!
如果你也在做类似的线束/排线检测,欢迎在评论区交流优化思路。
文章版本: v1.0(初学者练习版)
软件环境: VisionPro 9.0
转载请注明出处。
如需要检测图片欢迎私

