当前位置: 首页 > news >正文

VisionPro 相机集成与视觉测量

一、核心概念

术语说明
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. 图像读取方法

方法一:CogImageFileTool
public 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) { // 将最新图像传递到 ToolBlock(Input 名称在 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 == nullcogFrame.Count < 1

  • 原因:相机未正确连接或驱动未安装

  • 解决

    1. 检查相机物理连接(网线/电源)

    2. 确认相机 IP 地址与电脑在同一网段

    3. 安装 GigE Vision 驱动(如 AX88179)

    4. 使用相机厂商工具测试连接

错误2:图像采集超时

  • 现象StartAcquire()后长时间无图像

  • 原因:相机配置错误或网络延迟

  • 解决

    1. 检查CreateAcqFifo的相机类型参数是否正确

    2. 增加采集超时时间

    3. 检查网络带宽和交换机配置

错误3:VPP 文件加载失败

  • 现象CogSerializer.LoadObjectFromFile()抛出异常

  • 原因:VPP 文件路径错误或文件损坏

  • 解决

    1. 确认 VPP 文件存在于指定路径

    2. 检查 VPP 文件是否与当前 VisionPro 版本兼容

    3. 使用 QuickBuild 重新生成 VPP 文件

错误4:实时显示卡顿

  • 现象:实时预览画面不流畅

  • 原因:图像分辨率过高或系统资源不足

  • 解决

    1. 降低相机分辨率或帧率

    2. 关闭不必要的后台程序

    3. 使用更高性能的显卡

错误5:图像保存失败

  • 现象:保存图像时抛出异常

  • 原因:路径权限或磁盘空间不足

  • 解决

    1. 检查保存路径是否有写入权限

    2. 确认磁盘空间充足

    3. 使用Directory.Exists()检查并创建目录

错误6:ToolBlock 执行失败

  • 现象Tb.Run()后无输出或结果异常

  • 原因:输入图像未正确设置或工具配置错误

  • 解决

    1. 检查Tb.Inputs["OutputImage"].Value是否已赋值

    2. 在 QuickBuild 中验证 ToolBlock 配置

    3. 使用Tb.CreateLastRunRecord()检查运行记录

四、相关资源

  • 官方文档:Cognex VisionPro Documentation

http://www.jsqmd.com/news/856284/

相关文章:

  • 摆脱论文困扰! AI论文工具2026最新测评与推荐
  • 【Perplexity词组搭配查询避坑清单】:8个致命误用场景+3类伪低困惑度陷阱,资深语言工程师紧急预警
  • Visa携手Jason Sudeikis,将足球赛场最简单的进球方式转化为2026年国际足联世界杯的最精彩球迷时刻
  • CSS锚点定位(Anchor Positioning)完全指南:实现精准定位
  • AUTOSAR Ea模块深度解析:EEPROM抽象原理、配置实战与性能优化
  • Win10开发环境搭建必看:彻底解决ping localhost返回::1导致服务启动失败的问题
  • AI Agent Harness Engineering 不是银弹:哪些场景用了 Multi-Agent 反而更差
  • Windows下安装OpenCode并配置oh-my-openagent和superpowers
  • STM32CubeMX 6.14版本保姆级安装教程(附CSDN下载链接,解决官网卡顿)
  • 1987年5月25日晚上23-24点出生性格、运势和命运
  • 昇腾CANN shmem:把多张 NPU 的 HBM 变成一块全局内存
  • HP Z66 G6 外接显示器无信号排查:amdgpu DCN 3.1 EDID 超时与 HDMI 2.1 FRL 协商问题
  • AI一周事件 · 2026-05-13 至 2026-05-19
  • 从Java到AI大模型:小白程序员必备转型指南,收藏学习不迷路!
  • ADI AD5940阻抗测量开发板开箱实测:从硬件连接到IAR工程配置的保姆级避坑指南
  • 2026年牵手红娘服务权威推荐深度分析:婚恋场景用户择偶效率低与线下见面率低困境 - 品牌推荐
  • 程序员修炼之道:从代码到思维的进阶指南
  • OpenWrt opkg配置进阶:手把手教你设置代理、跳过证书检查,解决国内下载慢问题
  • 平衡小车/四轴飞行器姿态解算实战:MPU6050三种滤波算法(四元数、互补、卡尔曼)代码详解与选型指南
  • Option ‘importsNotUsedAsValues‘ has been removed. Please remove it from your configuration
  • 5分钟掌握AI音频分离:Retrieval-based-Voice-Conversion-WebUI终极指南
  • SAP应收清账程序开发避坑指南:外币、超额收款、表更新这些细节别忽略
  • C语言编程实战:用ASCII码表玩转字符大小写转换(附完整代码)
  • 告别手写C代码!Matlab 2020b S-Function Builder保姆级配置教程(附避坑指南)
  • 2026年牵手红娘服务权威推荐深度分析:婚恋场景线上虚假信息泛滥与线下见面率低痛点 - 品牌推荐
  • uni-app视频播放二选一:手把手对比调试video.js与MuiPlayer插件(H5/m3u8实战)
  • DeepStream9.0 masktracker
  • 告别零散脚本:用Playwright+Pytest+Yaml+Allure搭建一个真正可维护的UI自动化项目
  • 昇腾CANN ascend-boost-comm:M×N 算子复用是怎么做到的
  • BlueStacks 5 instance differences