一、核心概念术语说明CogAcqFifoTool相机采集工具用于连接相机并获取图像CogFrameGrabber帧抓取器接口用于直接连接 GigE/GigE Vision 相机ICogAcqFifo图像采集 FIFO 接口支持异步采集和事件回调CogDisplayVisionPro 显示控件支持图像和图形叠加显示CogRecordDisplay增强型显示控件支持 ToolBlock 运行记录显示CogJobManagerQuickBuild 作业管理器用于管理多个视觉任务CogJob单个视觉作业包含采集、处理、输出等工具链CogToolBlock工具块用于组织和执行多个视觉工具CogSerializer序列化工具用于保存和加载 .vpp 配置文件CogAcqFifoEditV2相机采集编辑控件提供相机参数配置界面CogToolBlockEditV2ToolBlock 编辑控件提供工具链配置界面CogPMAlignTool模板匹配工具用于定位和识别目标对象CogFindCircleTool查找圆形工具用于检测图像中的圆形CogCircle圆形对象用于存储圆心坐标和半径CogGraphicLabel图形标签用于在图像上显示文本信息StartLiveDisplay实时显示方法用于开启相机实时预览StopLiveDisplay停止实时显示方法二、常用操作1. 相机连接方式方式一VPP 文件方式推荐初学者// 1. 加载预配置的 VPP 文件 string vppPath Directory.GetCurrentDirectory() \VPP\acq.vpp; CogAcqFifoTool cogAcq CogSerializer.LoadObjectFromFile(vppPath) as CogAcqFifoTool; ​ // 2. 绑定到编辑控件 cogAcqFifoEditV21.Subject cogAcq; ​ // 3. 拍照 cogAcq.Run(); ICogImage img cogAcq.OutputImage; ​ // 4. 显示图像 cogDisplay1.Image img; cogDisplay1.Fit(); ​ // 5. 释放相机 if (cogAcq.Operator ! null) { cogAcq.Operator.FrameGrabber.Disconnect(false); }方式二FrameGrabber 方式推荐生产环境public ICogFrameGrabber mGrabber; public ICogAcqFifo mFifo; ​ // 1. 获取所有已连接的相机 CogFrameGrabbers cogFrame new CogFrameGrabbers(); ​ if (cogFrame.Count 1) { MessageBox.Show(相机连接失败); return; } ​ // 2. 遍历相机并创建采集接口 foreach (ICogFrameGrabber frame in cogFrame) { mGrabber frame; // 创建 GigE 相机采集接口 mFifo frame.CreateAcqFifo( Generic GigEVision (Mono), // 相机类型 CogAcqFifoPixelFormatConstants.Format8Grey, // 像素格式 0, // 缓冲区数量 true // 是否自动开始 ); } ​ // 3. 绑定采集完成事件 mFifo.Complete mAcq_com; ​ // 4. 拍照 mFifo.StartAcquire(); ​ // 5. 采集完成回调每次 StartAcquire 完成后自动触发 public void mAcq_com(object sender, CogCompleteEventArgs e2) { int numPendingVal, numReadyVal; bool busyVal; // GetFifoState: numPendingVal等待中帧数, numReadyVal已就绪帧数, busyVal是否忙碌 mFifo.GetFifoState(out numPendingVal, out numReadyVal, out busyVal); if (numReadyVal 0) // 有已就绪的图像帧才处理 { CogAcqInfo info new CogAcqInfo(); // 存储采集元信息时间戳等 ICogImage image mFifo.CompleteAcquireEx(info); // 结束采集并取出图像 cogRecordDisplay1.Image image; cogRecordDisplay1.Fit(); } } ​ // 6. 设置曝光参数 mFifo.OwnedExposureParams.Exposure Convert.ToDouble(textBox1.Text); ​ // 7. 释放相机 public void Release() { CogFrameGrabbers cogFrame new CogFrameGrabbers(); foreach (ICogFrameGrabber item in cogFrame) { item.Disconnect(false); } }2. 实时显示控制// 开启实时显示 // 参数 false: 不使用外部触发持续预览true 则等待硬件触发信号 cogDisplay1.StartLiveDisplay(cogAcq.Operator, false); cogRecordDisplay1.StartLiveDisplay(cogAcq.Operator, false); ​ // 关闭实时显示退出窗体前必须调用否则相机无法释放 cogDisplay1.StopLiveDisplay(); cogRecordDisplay1.StopLiveDisplay();3. 图像保存方法方法一CogImageFileTool推荐public void SaveImage1(ICogImage image) { // 设置保存路径 string path Directory.GetCurrentDirectory() \Image1; if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } // 使用动态文件名 string imageName ${DateTime.Now.ToString(yyyyMMddHHmmss)}.bmp; // 保存图像 CogImageFileTool fileTool new CogImageFileTool(); fileTool.InputImage image; fileTool.Operator.Open(${path}\\{imageName}, CogImageFileModeConstants.Write); fileTool.Run(); }方法二Bitmap 方式public void SaveImage2(CogDisplay dis) { string path Directory.GetCurrentDirectory() \Image2; if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } string imageName ${DateTime.Now.ToString(yyyyMMddHHmmss)}.jpeg; // CreateContentBitmap: Image仅图像内容AllContent含叠加图形 Bitmap bmp (Bitmap)dis.CreateContentBitmap(CogDisplayContentBitmapConstants.Image); bmp.Save(${path}\\{imageName}, ImageFormat.Jpeg); }4. 图像读取方法方法一CogImageFileToolpublic ICogImage ReadImage1() { string path C:\Program Files\Cognex\VisionPro\Images\Caliper Demo Image.png; CogImageFileTool cogFile new CogImageFileTool(); cogFile.Operator.Open(path, CogImageFileModeConstants.Read); cogFile.Run(); return cogFile.OutputImage; }方法二Bitmap 转换public ICogImage ReadImage2() { string path C:\Program Files\Cognex\VisionPro\Images\Caliper Demo Image.png; Bitmap tamp new Bitmap(path); // CogImage24PlanarColor: 彩色图像灰度图像用 CogImage8Grey return new CogImage24PlanarColor(tamp); }5. ToolBlock 加载与执行public CogToolBlock Tb; public ICogImage tbimg; ​ // 1. 加载 ToolBlock public void LoadToolBlock() { string path Directory.GetCurrentDirectory() \tb.vpp; Tb CogSerializer.LoadObjectFromFile(path) as CogToolBlock; } ​ // 2. 执行测量 private void button7_Click(object sender, EventArgs e) { // 将最新图像传递到 ToolBlockInput 名称在 QuickBuild 中定义 Tb.Inputs[OutputImage].Value tbimg; // 运行 ToolBlock内部工具链按顺序全部执行 Tb.Run(); // SubRecords[0]: 第一个子工具的运行记录用于在 Display 上显示检测图形 cogRecordDisplay1.Record Tb.CreateLastRunRecord().SubRecords[0]; cogRecordDisplay1.Fit(); // 获取输出结果Output 名称在 QuickBuild 的 ToolBlock 终端中定义 double douwidth (double)Tb.Outputs[myWidth].Value; label2.Text douwidth.ToString(); }6. QuickBuild 作业管理// 注意使用 CogJobManager/CogJob 需在引用中右键添加 Cognex.VisionPro.QuickBuild // 并在代码中引入以下命名空间 // using Cognex.VisionPro.QuickBuild; // using Cognex.VisionPro.ToolGroup; // 1. 加载 QuickBuild JobManager CogJobManager cogJobManager CogSerializer.LoadObjectFromFile( Directory.GetCurrentDirectory() \VPP\QuickBuild1.vpp) as CogJobManager; cogJobManagerEdit1.Subject cogJobManager; // 2. 获取 Job CogJob job cogJobManager.Job(0); // 索引 0 表示第一个 Job // 3. 获取 Job 的工具组 CogToolGroup ctg job.VisionTool as CogToolGroup; // 4. 从工具组获取具体工具 CogAcqFifoTool acq ctg.Tools[0] as CogAcqFifoTool; // 或按名称获取 // CogAcqFifoTool acq ctg.Tools[CogAcqFifoTool1] as CogAcqFifoTool; // 5. 加载 Job 到编辑控件 cogJobEdit1.Subject job.VisionTool as CogToolGroup;7. 多零件测量脚本示例public class CogToolBlockAdvancedScript : CogToolBlockAdvancedScriptBase { private CogToolBlock mToolBlock; private CogGraphicCollection col new CogGraphicCollection(); public override bool GroupRun(ref string message, ref CogToolResultConstants result) { CogPMAlignTool pma mToolBlock.Tools[CogPMAlignTool1] as CogPMAlignTool; CogFindCircleTool fc mToolBlock.Tools[CogFindCircleTool1] as CogFindCircleTool; CogCircle circle; CogGraphicLabel label; col.Clear(); // 每次运行前清空上一次的图形避免残留 // 先运行所有工具PMAlign 在此阶段完成全图搜索 foreach (ICogTool tool in mToolBlock.Tools) mToolBlock.RunTool(tool, ref message, ref result); // 遍历 PMAlign 结果 for (int i 0; i pma.Results.Count; i) { // 设置找圆工具的中心点 fc.RunParams.ExpectedCircularArc.CenterX pma.Results[i].GetPose().TranslationX; fc.RunParams.ExpectedCircularArc.CenterY pma.Results[i].GetPose().TranslationY; // 运行找圆工具 fc.Run(); // 获取圆并添加到集合 circle fc.Results.GetCircle(); circle.Color CogColorConstants.Orange; col.Add(circle); // 添加半径标签 label new CogGraphicLabel(); label.SetXYText(circle.CenterX, circle.CenterY, 半径 circle.Radius.ToString(0.00)); label.Color CogColorConstants.Red; col.Add(label); } return false; // false 脚本已自行运行工具ToolBlock 不再重复执行 } public override void ModifyLastRunRecord(ICogRecord lastRecord) { // 将 col 中所有图形叠加到 PMAlign 的输入图像图层上供 Display 渲染 for (int i 0; i col.Count; i) { mToolBlock.AddGraphicToRunRecord(col[i], lastRecord, CogPMAlignTool1.InputImage, Script); } } public override void Initialize(CogToolGroup host) { base.Initialize(host); mToolBlock host as CogToolBlock; } }8. VPP 文件保存public bool SaveVpp(CogAcqFifoTool acq) { try { CogSerializer.SaveObjectToFile(acq, vppPath); return true; } catch (Exception) { return false; } }三、问题排查错误1相机连接失败现象cogAcq.Operator null或cogFrame.Count 1原因相机未正确连接或驱动未安装解决检查相机物理连接网线/电源确认相机 IP 地址与电脑在同一网段安装 GigE Vision 驱动如 AX88179使用相机厂商工具测试连接错误2图像采集超时现象StartAcquire()后长时间无图像原因相机配置错误或网络延迟解决检查CreateAcqFifo的相机类型参数是否正确增加采集超时时间检查网络带宽和交换机配置错误3VPP 文件加载失败现象CogSerializer.LoadObjectFromFile()抛出异常原因VPP 文件路径错误或文件损坏解决确认 VPP 文件存在于指定路径检查 VPP 文件是否与当前 VisionPro 版本兼容使用 QuickBuild 重新生成 VPP 文件错误4实时显示卡顿现象实时预览画面不流畅原因图像分辨率过高或系统资源不足解决降低相机分辨率或帧率关闭不必要的后台程序使用更高性能的显卡错误5图像保存失败现象保存图像时抛出异常原因路径权限或磁盘空间不足解决检查保存路径是否有写入权限确认磁盘空间充足使用Directory.Exists()检查并创建目录错误6ToolBlock 执行失败现象Tb.Run()后无输出或结果异常原因输入图像未正确设置或工具配置错误解决检查Tb.Inputs[OutputImage].Value是否已赋值在 QuickBuild 中验证 ToolBlock 配置使用Tb.CreateLastRunRecord()检查运行记录四、相关资源官方文档Cognex VisionPro Documentation