当前位置: 首页 > 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.gsyq.cn/news/1336782.html

相关文章:

  • 嵌入式DevOps实践:从环境容器化到自动化流水线
  • AUTOSAR Ea模块深度解析:EEPROM抽象原理、配置实战与性能优化
  • CSS锚点定位(Anchor Positioning)完全指南:实现精准定位
  • Win10开发环境搭建必看:彻底解决ping localhost返回::1导致服务启动失败的问题
  • Codex 完整教程中文文档
  • HP Z66 G6 外接显示器无信号排查:amdgpu DCN 3.1 EDID 超时与 HDMI 2.1 FRL 协商问题
  • 嵌入式Linux下MT7601U无线网卡驱动移植与网络配置实战
  • 从0到1:企业级AI项目迭代日记 Vol.29|自然语言变工作流:Agent 自动拼装子图的实现路径
  • 2026年牵手红娘服务权威推荐深度分析:婚恋场景线上虚假信息泛滥与线下见面率低痛点 - 品牌推荐
  • SAP应收清账程序开发避坑指南:外币、超额收款、表更新这些细节别忽略
  • QGIS打印布局实战:手把手教你制作英国大曼彻斯特地区社会经济多指标对比地图集
  • 网络突然卡成PPT?别慌,手把手教你用display命令快速定位交换机环路
  • DeepStream9.0 masktracker
  • 告别零散脚本:用Playwright+Pytest+Yaml+Allure搭建一个真正可维护的UI自动化项目
  • 深度解析ComfyUI-Impact-Pack V8:专业级AI图像增强与工作流优化完整指南
  • 保姆级教程:用Abaqus HETVAL子程序搞定混凝土水化热仿真(附完整Fortran代码)
  • 面向知识图谱 Agent 的 Harness 查询优化
  • 本地大模型常见异常全解:显存溢出、推理慢、驱动报错、环境冲突调试指南.181
  • DAC代码干扰分析与硬件设计解决方案
  • 写给前端的 opbase:昇腾基础组件到底是啥?
  • 保姆级避坑指南:用Jupyter Notebook和PyTorch复现小土堆教程的完整流程(附代码)
  • 高并发场景下 Redis 消息队列吞吐量低怎么优化?
  • 从Quill光标到用户头像:手把手教你为Yjs协同编辑器添加完整的在线用户列表(附状态同步技巧)
  • 实战避坑:在VisDrone/MOT17数据集上评测YOLO+DeepSORT/ByteTrack组合,我的参数调优心得
  • 告别翻协议!我用QT和DLL封装3GPP R17表格,做了个NR5G信道频点计算器
  • 避开电源大坑!手把手教你搞定RFSoC Gen3的上电与断电时序(附Vivado配置)
  • 避坑指南:Linux下用regulator_disable关不掉电源?可能是设备树里这个参数在搞鬼
  • Ubuntu 22.04 装N卡驱动报错‘Building kernel modules’?别慌,试试这个降级内核的保姆级教程
  • Windows 10 下 GAMMA 遥感软件安装全攻略:从加密狗驱动到 MSYS2 环境配置避坑指南
  • OpenWrt opkg配置进阶:手把手教你设置代理、跳过证书检查,解决国内下载慢问题