VisionPro中CogGraphicLabel动态文本标注:从原理到工业视觉实战

发布时间:2026/8/2 5:05:05
VisionPro中CogGraphicLabel动态文本标注:从原理到工业视觉实战
1. 项目概述在VisionPro中动态显示文本标签在机器视觉项目开发中尤其是在使用康耐视VisionPro这类强大的工具时我们经常遇到一个看似简单却至关重要的需求如何在图像上清晰、动态地显示文本信息。这个信息可能是检测结果如“OK”或“NG”、测量数据如直径12.34mm、状态提示甚至是调试过程中的中间变量值。CogGraphicLabel正是VisionPro图形显示库中专门用于解决这个问题的核心工具。简单来说CogGraphicLabel就是一个可以在CogDisplay控件上绘制的文本图形对象。与静态的、写在界面上的Label控件不同它是通过脚本C#或VB.NET动态创建、配置位置、内容和样式并叠加到实时图像或处理结果上的。这对于需要将视觉分析结果直观“标注”在图像上的场景来说是不可或缺的功能。无论是简单的字符识别结果显示还是复杂的多参数测量报告叠加CogGraphicLabel都能让操作者一目了然。想象一下这样的场景一个圆环零件经过视觉系统检测我们需要在图像上该圆环旁边显示“外径25.60mm内径15.20mm判定合格”。如果这个结果显示在软件界面角落的某个文本框里操作员需要来回对照图像和数字既容易出错又效率低下。而使用CogGraphicLabel我们可以直接将这行文本绘制在圆环图像的旁边实现“所见即所得”的效果。这对于齿轮检测、孔洞尺寸测量、车牌识别结果标注等应用能极大提升人机交互的友好度和系统的专业性。2. CogGraphicLabel核心功能与属性解析要熟练使用CogGraphicLabel首先必须深入理解它的关键属性。这些属性决定了标签在屏幕上呈现的一切内容、位置、外观。下面我们将逐一拆解并解释其背后的设计逻辑和常见用法。2.1 内容与位置文本显示的基础CogGraphicLabel的核心是显示文本因此与文本内容和位置相关的属性是首先要掌握的。Text属性这是标签的灵魂类型为string。你需要动态赋值的所有信息都存储在这里。例如myLabel.Text $直径: {diameter:F2} mm;。这里有一个关键技巧为了确保文本能清晰显示且不被截断在设置Text属性前尤其是当文本内容来自变量如测量值、识别结果时建议使用String.Format或C#的字符串插值$””来规范格式控制小数位数避免因数字过长导致显示混乱。X和Y属性这两个double类型的属性定义了标签的锚点在显示坐标系中的位置。这里有一个非常重要的概念锚点。(X, Y)指定的坐标点并不是文本区域的左上角或中心而是由Alignment属性后文详述决定的那个“对齐基准点”。例如当Alignment设置为CogGraphicLabelAlignmentConstants.TopLeft时(X, Y)就是文本包围盒的左上角坐标如果设置为CogGraphicLabelAlignmentConstants.Center那么(X, Y)就是文本的中心点坐标。理解这一点对于精确定位标签至关重要。通常我们会根据一个特征点如一个圆的中心、一个Blob的质心来计算标签的期望位置。Space属性这是一个容易被忽视但极其重要的属性类型为CogCoordinateSpaceConstants枚举。它定义了X和Y属性所使用的坐标系。常见选项有CogCoordinateSpaceConstants.Pixel: 使用图像像素坐标。这是最直接的方式标签位置相对于图像左上角(0,0)定义。CogCoordinateSpaceConstants.Scene: 使用“场景”坐标这是VisionPro中经过标定转换后的物理坐标如毫米。如果你的视觉系统经过了标定并且希望标签显示在与物理位置对应的点上就应该使用此选项。例如测量一个圆环的外径圆的中心坐标是通过标定后的工具得到的物理坐标那么将标签的Space设为SceneX/Y设为该物理坐标就能确保标签始终“跟”着特征点即使图像分辨率或相机位置发生变化。CogCoordinateSpaceConstants.Display: 相对于显示控件客户区的坐标。这种方式较少用于标注图像特征更多用于在显示控件固定位置显示状态信息。实操心得在涉及物理测量的项目中强烈建议将CogGraphicLabel的Space属性设置为CogCoordinateSpaceConstants.Scene。这样你的文本标签就和你的测量工具如CogCircularArc、CogLineSegment处于同一坐标系下定位逻辑清晰且能适应相机视野的变化。如果混合使用像素坐标和场景坐标进行定位会导致标签在图像缩放或平移时“飘走”。2.2 外观与样式让信息清晰可读光有内容和位置还不够在复杂的工业图像背景可能充满纹理、反光、阴影下让文本清晰可辨是一门学问。CogGraphicLabel提供了一系列属性来控制其外观。Color属性类型为CogColor用于设置文本颜色。选择颜色时必须考虑图像背景。一个简单的原则是选择与背景区域对比度最高的颜色。例如在暗色背景上用亮色白、黄、青在亮色背景上用暗色黑、红、深蓝。VisionPro的CogColor可以通过CogColorConstants枚举快速获取如CogColorConstants.Green也可以通过CogColor.FromArgb(alpha, red, green, blue)方法自定义带透明度的颜色。Font属性类型为System.Drawing.Font。你可以像在WinForms中一样设置字体名称如“Arial”、“微软雅黑”、大小和样式加粗、斜体。字体大小的选择需要谨慎。在场景坐标系下字体大小单位是“世界单位”如毫米这意味着如果你设置Font.Size 2文本高度就大约是2毫米。这能保证在不同放大倍数下文本的物理大小是恒定的易于阅读。如果在像素坐标系下字体大小是像素单位放大图像时字体会显得很小。Alignment属性类型为CogGraphicLabelAlignmentConstants枚举。如前所述它决定了文本相对于(X, Y)坐标点的对齐方式。常用值包括TopLeft、TopCenter、Center、BottomRight等。这个属性与定位逻辑紧密相关。例如如果你想在一个检测到的斑点(CogBlob)质心正上方显示标签可以将Alignment设为BottomCenter然后将标签的(X, Y)设置为斑点的质心坐标。这样文本的底部中心点就会对准质心文本出现在斑点的正上方。其他增强属性BackColor设置文本的背景色。在背景杂乱时给文本加一个不透明的背景色块如半透明的黑色可以极大地提升可读性。BackOpacity背景色的不透明度0-255。设置为128左右可以实现半透明效果既突出文字又不完全遮挡图像细节。Selected一个bool值表示该图形是否被选中。当为true时VisionPro会以高亮形式如虚线框显示该图形这在交互式调试时非常有用。3. 脚本中创建与显示CogGraphicLabel的完整流程理解了核心属性后我们来看如何在C#脚本中从头开始创建并显示一个CogGraphicLabel。这个过程可以分解为几个清晰的步骤我们将结合一个“在检测到的圆环中心显示其外径”的具体案例来讲解。3.1 环境准备与引用首先确保你的VisionPro项目通常是Windows Forms或WPF应用正确引用了必要的VisionPro程序集。最主要的是Cognex.VisionPro.dll。在C#脚本文件例如一个ToolBlock的脚本工具或者一个自定义的C#脚本模块的开头你需要添加对应的using指令using Cognex.VisionPro; using Cognex.VisionPro.Display; // 包含CogDisplay和CogGraphicLabel // 其他可能用到的命名空间如System.Drawing用于字体 using System.Drawing;3.2 动态创建与配置标签创建CogGraphicLabel实例非常简单直接使用new关键字即可。接下来的配置才是重点。假设我们已经通过一个CogCircularArcTool测量了一个圆环并得到了一个CogCircularArc结果对象myCircle其中包含了圆心物理坐标(CenterX,CenterY)和外径Radius。// 1. 创建CogGraphicLabel实例 CogGraphicLabel resultLabel new CogGraphicLabel(); // 2. 设置文本内容格式化测量结果保留两位小数 double outerDiameter myCircle.Radius * 2; // 直径半径*2 resultLabel.Text $外径: {outerDiameter:F2} mm; // 3. 设置位置使用圆的中心坐标 resultLabel.X myCircle.CenterX; resultLabel.Y myCircle.CenterY; // 4. 设置坐标系与测量工具保持一致使用场景坐标物理单位 resultLabel.Space CogCoordinateSpaceConstants.Scene; // 5. 设置对齐方式我们希望文本显示在圆心的正上方所以让文本的底部中心对准圆心点 resultLabel.Alignment CogGraphicLabelAlignmentConstants.BottomCenter; // 6. 设置外观 // 使用绿色字体在大多数工业图像偏灰上对比度较好 resultLabel.Color CogColorConstants.Green; // 创建字体使用“Arial”高度为3毫米场景坐标下加粗 // 注意Font构造函数中size参数在场景坐标下代表字体高度世界单位 resultLabel.Font new Font(Arial, 3.0f, FontStyle.Bold); // 设置深色半透明背景提升在复杂背景下的可读性 resultLabel.BackColor CogColorConstants.Black; resultLabel.BackOpacity 128; // 半透明3.3 将标签添加到显示控件创建并配置好标签后它只是一个内存中的对象并不会自动显示出来。你需要将它添加到CogDisplay控件的图形集合中。通常我们会在图像处理流程的最后一步将结果图形一次性添加到显示控件。在你的窗体类或脚本上下文中需要有一个CogDisplay控件假设名为cogDisplay1的引用。// 清除显示控件上之前添加的所有临时图形可选根据需求决定 cogDisplay1.InteractiveGraphics.Clear(); cogDisplay1.StaticGraphics.Clear(); // 将我们创建的结果标签添加到静态图形集合中 // StaticGraphics用于显示不需要交互的、结果性的图形 cogDisplay1.StaticGraphics.Add(resultLabel, ResultLabel); // 如果你还需要显示其他图形比如圆环本身 CogGraphicCircle circleGraphic new CogGraphicCircle(); circleGraphic.Set(myCircle); circleGraphic.Color CogColorConstants.Cyan; cogDisplay1.StaticGraphics.Add(circleGraphic, MeasuredCircle); // 最后刷新显示控件使所有更改生效 cogDisplay1.Refresh();关键点解析InteractiveGraphics和StaticGraphics这是CogDisplay的两个核心图形容器。InteractiveGraphics中的图形通常用于交互如手动绘制ROI可以被用户选择和拖动。StaticGraphics中的图形则是只读的用于显示最终的、固定的结果。对于CogGraphicLabel这类纯信息展示的图形放入StaticGraphics是更合适的选择。Add方法的第二个参数这是一个图形名称的标识符字符串可以为空但建议赋予一个有意义的名称如“ResultLabel”。这样便于在后续代码中通过名称查找、更新或删除特定的图形。Refresh()方法在修改了图形集合后必须调用Refresh()来通知控件重绘否则更改可能不会立即显示在屏幕上。3.4 封装与复用创建标签工具函数在实际项目中我们可能需要在不同地方创建风格一致的标签。为了避免代码重复可以将其封装成一个工具函数。public CogGraphicLabel CreateMeasurementLabel(double x, double y, string text, CogCoordinateSpaceConstants space CogCoordinateSpaceConstants.Scene, CogColor color null, string fontName Arial, float fontSize 2.5f) { CogGraphicLabel label new CogGraphicLabel(); label.Text text; label.X x; label.Y y; label.Space space; label.Alignment CogGraphicLabelAlignmentConstants.BottomCenter; // 常用对齐方式 // 默认颜色为绿色如果传入颜色则使用传入的 label.Color color ?? CogColorConstants.Green; // 创建字体默认加粗 label.Font new Font(fontName, fontSize, FontStyle.Bold); // 默认添加半透明黑色背景 label.BackColor CogColorConstants.Black; label.BackOpacity 128; return label; } // 使用示例 CogGraphicLabel label1 CreateMeasurementLabel(centerX, centerY, $直径: {diam:F2}mm); CogGraphicLabel label2 CreateMeasurementLabel(posX, posY, 状态: OK, color: CogColorConstants.Cyan); cogDisplay1.StaticGraphics.Add(label1, DiamLabel); cogDisplay1.StaticGraphics.Add(label2, StatusLabel);4. 高级应用与实战技巧掌握了基础用法后我们可以探索一些更高级和实用的场景这些技巧能显著提升你的VisionPro应用的专业性和用户体验。4.1 多标签管理与布局策略当一个画面中需要显示多个信息时例如多齿轮检测每个齿轮都需要显示编号和状态杂乱无章的标签会让人眼花缭乱。我们需要管理策略。使用集合管理不要散落着创建多个标签变量。可以使用ListCogGraphicLabel来统一管理。ListCogGraphicLabel allLabels new ListCogGraphicLabel(); foreach (var gearResult in gearResults) { var label CreateMeasurementLabel(...); allLabels.Add(label); cogDisplay1.StaticGraphics.Add(label, $Gear_{gearResult.ID}); }智能避让当两个特征点距离很近时它们的标签可能会重叠。一个简单的策略是根据特征点的Y坐标从上到下对标签进行排序然后动态调整Y轴偏移量。// 假设features是一个包含位置信息的列表 var sortedFeatures features.OrderBy(f f.Y).ToList(); float verticalSpacing 5.0f; // 标签垂直间距单位毫米场景坐标 float currentYOffset 0; foreach (var feat in sortedFeatures) { // 在原始Y坐标基础上增加一个偏移避免重叠 float labelY (float)feat.Y currentYOffset; var label CreateMeasurementLabel(feat.X, labelY, ...); // ... 添加标签 currentYOffset verticalSpacing; // 为下一个标签增加偏移 }分组与颜色编码用颜色区分不同类型的信息。例如测量值用白色合格结果用绿色超差结果用红色警告信息用黄色。CogColor statusColor; if (result.IsPass) statusColor CogColorConstants.Green; else if (result.IsWarning) statusColor CogColorConstants.Yellow; else statusColor CogColorConstants.Red;4.2 与VisionPro工具深度集成CogGraphicLabel的真正威力在于与其他VisionPro工具的运行时结果无缝集成。在ToolBlock脚本中直接使用这是最常见的场景。在ToolBlock的“脚本”工具中你可以访问上游工具的输出变量并创建标签来显示它们。// 在ToolBlock脚本中Inputs和Outputs是预定义对象 // 假设上游有一个CogPMAlignTool输出名为“Pose” ICogTransform2D partPose Inputs.Pose; // 获取部件位置 // 假设还有一个CogCaliperTool输出名为“Width” double measuredWidth Inputs.Width; // 创建显示位置的标签 CogGraphicLabel poseLabel new CogGraphicLabel(); poseLabel.Text $位置: ({partPose.TranslationX:F1}, {partPose.TranslationY:F1}); poseLabel.X partPose.TranslationX; poseLabel.Y partPose.TranslationY 5; // 在位置点下方5mm处显示 poseLabel.Space CogCoordinateSpaceConstants.Scene; poseLabel.Color CogColorConstants.White; // 将标签添加到脚本工具的图形输出中 Outputs.AddGraphicLabelToDisplay(poseLabel, “PoseInfo”);注意在ToolBlock脚本中通常不直接操作CogDisplay控件而是通过Outputs.AddGraphicToDisplay()或类似方法将图形添加到输出集合由VisionPro框架负责将其渲染到关联的显示控件上。标注Blob分析结果对于CogBlobTool你可能想标注每个斑点的面积、质心位置。CogBlobResult blobResult myBlobTool.Results; // 假设已运行并获取结果 foreach (CogBlobResultItem blob in blobResult.GetBlobs()) { string info $Area: {blob.Area:F0}\nCentroid: ({blob.CenterX:F1}, {blob.CenterY:F1}); var label CreateMeasurementLabel(blob.CenterX, blob.CenterY, info); label.Alignment CogGraphicLabelAlignmentConstants.TopCenter; // 信息较多放在质心上方 cogDisplay1.StaticGraphics.Add(label, $Blob_{blob.Id}); }动态更新标签内容在连续运行如Live Display模式下标签内容需要随着每一帧的新结果而更新。与其不断创建新标签不如复用已有的标签对象并更新其Text属性。// 在初始化时创建标签并保存引用 private CogGraphicLabel _fpsLabel; void InitializeDisplay() { _fpsLabel new CogGraphicLabel(); _fpsLabel.Space CogCoordinateSpaceConstants.Display; // 使用显示坐标固定在界面角落 _fpsLabel.X 10; // 距离左边10像素 _fpsLabel.Y 10; // 距离顶部10像素 _fpsLabel.Alignment CogGraphicLabelAlignmentConstants.TopLeft; _fpsLabel.Color CogColorConstants.Yellow; cogDisplay1.StaticGraphics.Add(_fpsLabel, “FPS”); } // 在每一帧处理完成后更新它 void ProcessFrame() { // ... 图像处理逻辑 double currentFPS CalculateFPS(); _fpsLabel.Text $FPS: {currentFPS:F1}; // 只更新文本无需重新添加图形 cogDisplay1.Refresh(); }4.3 性能优化与内存管理在高速、连续运行的视觉系统中图形渲染可能成为性能瓶颈。不当使用CogGraphicLabel可能导致内存泄漏或界面卡顿。避免在循环中重复创建如果在每一帧的处理循环中都new CogGraphicLabel()并添加而不清理旧的StaticGraphics集合会无限膨胀最终消耗大量内存并导致程序变慢甚至崩溃。正确的更新模式清除-重建模式适用于结果图形每次完全变化的场景。在每次处理前清除所有静态图形然后根据新结果创建全新的标签。这是最简单直接的方式。cogDisplay1.StaticGraphics.Clear(); foreach (var newResult in latestResults) { var label new CogGraphicLabel(); // 创建新的 // ... 配置label cogDisplay1.StaticGraphics.Add(label); }复用-更新模式适用于图形结构稳定仅内容变化的场景如固定在角落的FPS显示、状态灯。在初始化时创建图形并保存引用后续只更新其属性如Text,Color。控制图形数量在需要显示大量标签如上百个时考虑是否所有信息都是必要的。或许可以只显示异常结果或者通过鼠标悬停Tooltip的方式来显示详细信息。使用using语句对于非托管资源虽然CogGraphicLabel本身是托管对象但其底层与显示系统交互养成良好的习惯对于确定不再使用的、独立创建的图形对象如果后续不再需要可以考虑将其从图形集合中移除并置为null以帮助垃圾回收。但通常更关键的是管理好StaticGraphics集合本身。5. 常见问题排查与调试技巧实录即使按照步骤操作在实际开发中你仍可能遇到一些问题。下面是我在多年项目中总结的一些典型问题及其解决方法。5.1 标签不显示或位置不对这是新手最常遇到的问题可以从以下几个维度排查问题现象可能原因排查步骤与解决方案标签完全看不见1. 未将标签添加到CogDisplay的图形集合中。2. 添加后没有调用Refresh()。3. 标签的坐标远超出当前显示视野。4. 标签颜色与背景色完全相同。1. 检查代码是否有cogDisplay.StaticGraphics.Add(label, ...)。2. 确保在添加图形后调用了cogDisplay.Refresh()。3. 检查X,Y坐标值是否合理。尝试先设置为(0,0)或一个已知的特征点坐标看是否出现。4. 将Color设置为一个高对比度颜色如CogColorConstants.Red测试。标签位置偏离预期1.Space属性设置错误坐标系统一。2.Alignment属性理解有误锚点不对。3. 提供的X,Y坐标值本身有误。1.这是最常见的原因确认你的X,Y来源如工具结果使用什么坐标系像素/场景并确保标签的Space属性与之匹配。如果不匹配需要进行坐标转换。2. 画图理解在纸上画一个点作为(X,Y)根据你设置的Alignment如TopLeft,Center画出文本包围盒应该出现的位置。这能帮你快速理解对齐逻辑。3. 在调试器中输出你用来设置X,Y的变量值检查是否正确。标签在图像缩放/平移时“乱跑”Space属性使用不当。在图像缩放时使用Pixel坐标的标签会相对于图像像素移动而使用Scene坐标的标签会保持在物理世界的位置。如果你的应用涉及标定和物理测量始终坚持使用Scene坐标系来创建结果标签。确保你的图像显示控件正确关联了标定空间CogDisplay的SpaceTree属性。5.2 文本显示模糊或大小异常字体模糊通常发生在将低分辨率的位图字体进行非整数倍缩放时。确保CogDisplay控件的缩放模式Zoom属性设置合理尽量避免使用“缩放到适合”等导致非整数倍缩放的模式进行精细查看。使用常见的TrueType字体如Arial, Tahoma通常比系统点阵字体效果更好。字体大小异常牢记Font.Size在场景坐标下的意义。如果你设置Font.Size 10且Space Scene那么文本高度就是10个世界单位如10毫米。如果你觉得字太大或太小请检查你的标定关系是否正确即一个像素代表多少毫米。在像素坐标下(Space Pixel)Font.Size的单位是像素数值通常较小如12, 14。5.3 在ToolBlock脚本中图形不显示在VisionPro的ToolBlock脚本工具中你不能直接操作UI线程上的CogDisplay控件。必须通过VisionPro提供的特定接口来输出图形。错误做法在脚本中直接new CogGraphicLabel()并尝试添加到某个窗体控件的集合中。正确做法使用脚本工具的Outputs集合的图形添加方法。// 在ToolBlock脚本工具中 CogGraphicLabel myLabel new CogGraphicLabel(); // ... 配置myLabel // 关键步骤通过Outputs的图形添加方法传递出去 Outputs.AddGraphicLabelToDisplay(myLabel, “MyOutputLabel”); // 或者使用更通用的方法 // Outputs.AddGraphicToDisplay(myLabel, “MyOutputLabel”);然后在ToolBlock编辑器中你需要将该脚本工具的“图形”输出端口通常是一个名为“Graphics”的集合连接到下游通常是“CogDisplay”类型的终端工具或者直接连接到Job的图形输出。这样VisionPro运行框架才会自动将这些图形渲染到关联的显示窗口。5.4 内存泄漏与性能排查如果长时间运行后软件变慢可以按以下步骤排查检查图形集合在调试模式下在运行一段时间后检查cogDisplay1.StaticGraphics.Count的数量。如果这个数字持续增长说明旧的图形没有被清理存在“只加不删”的问题。审查代码逻辑确认在每次更新结果前是否调用了Clear()方法清除了不再需要的旧图形。或者是否采用了正确的“复用-更新”模式。使用性能分析工具如果问题复杂可以使用Visual Studio的性能分析器Performance Profiler查看CogGraphicLabel对象的分配和存活情况定位没有被释放的对象。一个实用的调试技巧在开发阶段可以临时添加一个显示当前图形数量的标签帮助你监控。// 在某个更新显示的函数中 int graphicCount cogDisplay1.StaticGraphics.Count cogDisplay1.InteractiveGraphics.Count; _debugLabel.Text $图形数量: {graphicCount}; // _debugLabel是一个预先创建好的、固定在角落的标签如果发现这个数量只增不减你就知道问题出在哪里了。