VisionPro 与 C# 联合编程:相机连接实战指南
在工业视觉检测与自动化领域,康耐视(Cognex)的 VisionPro 是一款功能强大的视觉开发工具,而 C# 凭借其简洁性与高效性,成为许多开发者的首选编程语言。本文将详细介绍如何通过 C# 与 VisionPro 联合编程实现相机连接,为后续的视觉检测应用开发奠定基础。
一、环境准备
1.1 安装 VisionPro
首先确保已安装康耐视 VisionPro 软件。安装过程中,注意勾选相关的开发工具包(如 Cognex.VisionPro.ToolBlock
等),这些工具包将为后续编程提供关键支持。
1.1 创建vpp项目连接相机
搜索Cognex Gige
更改本机和相机ip配置
修改子网掩码为255.255.255.0
配置驱动程序
更新驱动(如果能够选择9014Bytes,跳过此步骤)
更新更改
相机ip配置:注意Host IP 和IP address 第四位不能相同
打开visionPro
选择照相机,生成vpp文件并保存
1.3新建 C# 项目
打开 Visual Studio,创建一个新的 Windows 桌面应用程序(.NET Framework) 项目(也可根据需求选择其他类型,如 WPF,但本文以 WinForms 为例)。打开项目工具箱
然后打开VisionPro的ReferencedAssemblies文件夹
Ctrl+A全选,并将其直接拖入vp选项卡下
搜索cogAcqFifoEdit,将其加入From1窗体
同理,并加入三个按钮
右键单击项目点击属性
选择x64
点击重新生成解决方案
二、代码部分
接下来详细解析代码中各个方法的实现及其作用:
引入Cognex头文件
using Cognex.VisionPro;
using Cognex.VisionPro.ImageFile;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
加载相机配置
private void Form1_Load(object sender, EventArgs e)
{// 加载相机配置string path = @"C:\Users\15783\Desktop\VisionPro\连接相机\连接相机\bin\相机连接.vpp";// 必须要保证vpp中有CogAcqFifoTool才可以cogAcqFifoTool = CogSerializer.LoadObjectFromFile(path) as CogAcqFifoTool;cogAcqFifoEditV21.Subject = cogAcqFifoTool;
}
在窗体加载时,此方法从指定路径加载 VisionPro 的配置文件(.vpp
)。通过 CogSerializer.LoadObjectFromFile
方法将文件内容加载并转换为 CogAcqFifoTool
对象。确保 .vpp
文件中包含 CogAcqFifoTool
,否则转换会失败。最后将加载的 cogAcqFifoTool
设置为 cogAcqFifoEditV21
控件的 Subject
,以便通过该控件对相机采集工具进行配置和监控。
执行拍照操作
private void button1_Click(object sender, EventArgs e)
{// 拍照if (cogAcqFifoTool == null){cogAcqFifoTool = new CogAcqFifoTool();}if (cogAcqFifoTool.Operator == null){MessageBox.Show("相机连接有问题");return;}cogAcqFifoTool.Run();cogDisplay1.Image = cogAcqFifoTool.OutputImage;cogDisplay1.Fit();
}
当点击拍照按钮时,首先检查 cogAcqFifoTool
是否为空,若为空则创建一个新的 CogAcqFifoTool
实例。接着验证 cogAcqFifoTool.Operator
是否存在,若不存在则弹出提示 “相机连接有问题” 并返回。若连接正常,调用 cogAcqFifoTool.Run()
执行拍照。拍照完成后,将获取的图像 cogAcqFifoTool.OutputImage
显示在 cogDisplay1
控件上,并通过 cogDisplay1.Fit()
方法让图像适配显示区域。
释放相机资源
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{// 获取当前的所有相机资源CogFrameGrabbers cogFrame = new CogFrameGrabbers();foreach (ICogFrameGrabber item in cogFrame){item.Disconnect(false);}
}
在窗体关闭时,此方法用于释放所有与相机相关的资源。首先创建 CogFrameGrabbers
对象来获取当前所有的相机帧采集器,然后通过循环遍历每个 ICogFrameGrabber
项,调用 Disconnect
方法断开与相机的连接,参数 false
表示在断开连接时不等待正在进行的操作完成。
切换实时显示
private void button2_Click(object sender, EventArgs e)
{if (button2.Text == "实时显示"){button2.Text = "停止实时显示";cogDisplay1.StartLiveDisplay(cogAcqFifoTool.Operator, false);}else{button2.Text = "实时显示";cogDisplay1.StopLiveDisplay();}
}
该方法实现了实时显示的切换功能。当按钮文本为 “实时显示” 时,点击按钮将文本改为 “停止实时显示”,并调用 cogDisplay1.StartLiveDisplay
方法启动实时显示,传入 cogAcqFifoTool.Operator
作为相机操作对象,参数 false
表示不使用缓存。反之,当按钮文本为 “停止实时显示” 时,点击按钮将文本改回 “实时显示”,并调用 cogDisplay1.StopLiveDisplay
方法停止实时显示。
存储拍摄的图片
private void button3_Click(object sender, EventArgs e)
{// 存储图片string path = Directory.GetCurrentDirectory() + @"\ImageDir";if (!Directory.Exists(path)){Directory.CreateDirectory(path);}// 定义文件路径string imageName = $"{DateTime.Now.ToString("HHmmss")}.bmp";// 保存图片ICogImage image = cogAcqFifoTool.OutputImage;// 文件存储工具(读写)CogImageFileTool fileTool = new CogImageFileTool();fileTool.InputImage = image;fileTool.Operator.Open($"{path}\\{imageName}", CogImageFileModeConstants.Write);fileTool.Run();
}
点击存储图片按钮时,首先确定存储目录 path
,通过 Directory.GetCurrentDirectory()
获取当前应用程序目录并拼接上 \ImageDir
作为存储路径。检查该目录是否存在,若不存在则使用 Directory.CreateDirectory(path)
创建目录。然后生成文件名 imageName
,以当前时间(格式为 HHmmss
)命名并加上 .bmp
后缀。接着获取当前拍摄的图像 cogAcqFifoTool.OutputImage
,创建 CogImageFileTool
对象 fileTool
,将获取的图像设置为 fileTool
的 InputImage
。再通过 fileTool.Operator.Open
方法打开指定路径和文件名的文件,设置为写入模式(CogImageFileModeConstants.Write
),最后调用 fileTool.Run()
执行存储操作,将图像保存到指定位置。
通过以上代码,实现了相机配置加载、拍照、实时显示控制以及图片存储等功能,为基于 VisionPro 和 C# 的工业视觉应用开发提供了基础的相机操作支持。在实际应用中,还可以根据需求进一步扩展和优化,例如添加更丰富的相机参数设置界面、完善图像预处理逻辑或实现与其他业务系统的数据交互等。
完整代码
using Cognex.VisionPro;
using Cognex.VisionPro.ImageFile;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace 连接相机
{public partial class Form1 : Form
{
CogAcqFifoTool cogAcqFifoTool = null;
public Form1()
{
InitializeComponent();
}private void Form1_Load(object sender, EventArgs e)
{
//加载相机配置
string path = @"C:\Users\15783\Desktop\VisionPro\连接相机\连接相机\bin\相机连接.vpp";
//必须要保证vpp中有CogAcqFifoTool才可以
cogAcqFifoTool = CogSerializer.LoadObjectFromFile(path) as CogAcqFifoTool;
cogAcqFifoEditV21.Subject = cogAcqFifoTool;
}private void button1_Click(object sender, EventArgs e)
{
//拍照
if (cogAcqFifoTool == null)
{
cogAcqFifoTool = new CogAcqFifoTool();
}
if(cogAcqFifoTool.Operator== null)
{
MessageBox.Show("相机连接有问题");
return;
}
cogAcqFifoTool.Run();
cogDisplay1.Image = cogAcqFifoTool.OutputImage;
cogDisplay1.Fit();
}private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
//获取当前的所有相机资源
CogFrameGrabbers cogFrame = new CogFrameGrabbers();
foreach(ICogFrameGrabber item in cogFrame)
{
item.Disconnect(false);
}
}private void button2_Click(object sender, EventArgs e)
{
if (button2.Text == "实时显示")
{
button2.Text = "停止实时显示";
cogDisplay1.StartLiveDisplay(cogAcqFifoTool.Operator,false);}
else
{
button2.Text = "实时显示";
cogDisplay1.StopLiveDisplay();
}
}private void button3_Click(object sender, EventArgs e)
{
//存储图片
string path = Directory.GetCurrentDirectory() + @"\ImageDir";
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
//定义文件路径
string imageName = $"{DateTime.Now.ToString("HHmmss")}.bmp";
//保存图片
ICogImage image =cogAcqFifoTool.OutputImage;
//文件存储工具(读写)
CogImageFileTool fileTool = new CogImageFileTool();
fileTool.InputImage = image;
fileTool.Operator.Open($"{path}\\{imageName}", CogImageFileModeConstants.Write);
fileTool.Run();
}
}
}
相关文章:

VisionPro 与 C# 联合编程:相机连接实战指南
在工业视觉检测与自动化领域,康耐视(Cognex)的 VisionPro 是一款功能强大的视觉开发工具,而 C# 凭借其简洁性与高效性,成为许多开发者的首选编程语言。本文将详细介绍如何通过 C# 与 VisionPro 联合编程实现相机连接&a…...
鸿蒙OSUniApp 实现动态的 tab 切换效果#三方框架 #Uniapp
使用 UniApp 实现动态的 tab 切换效果 在移动应用开发中,tab 切换(标签页)是提升界面组织性和用户体验的常用交互方式。无论是资讯、商城、社区还是管理后台,tab 组件都能帮助用户高效切换不同内容区域。随着 HarmonyOSÿ…...
Docker系列(三):深度剖析Dockerfile与图形化容器实战 --- 3种容器构建方法对比与性能调优
引言 在云原生技术驱动软件交付革新的当下,Dockerfile 作为容器化技术的核心载体,通过声明式语法将应用环境固化为可复现、可版本化的“蓝图”,彻底终结了“开发-生产”环境割裂的顽疾。本文以 Ubuntu 24.04 LTS 为实践基础,深度…...
论文阅读:Next-Generation Database Interfaces:A Survey of LLM-based Text-to-SQL
地址:Next-Generation Database Interfaces: A Survey of LLM-based Text-to-SQL 摘要 由于用户问题理解、数据库模式解析和 SQL 生成的复杂性,从用户自然语言问题生成准确 SQL(Text-to-SQL)仍是一项长期挑战。传统的 Text-to-SQ…...

OS面试篇
用户态和内核态 用户态和内核态的区别? 内核态和用户态是操作系统中的两种运行模式。它们的主要区别在于权限和可执行的操作: 内核态(Kernel Mode):在内核态下,CPU可以执行所有的指令和访问所有的硬件资…...

FFMPEG-FLV-MUX编码
一、流程图 二、结构体 1 .AVOutputFormat 一、核心功能与作用 封装格式描述 AVOutputFormat保存了输出容器格式的元数据,包括: 短名称(name):如flv、mp4;易读名称(long_name)&…...
青少年编程与数学 02-020 C#程序设计基础 05课题、数据类型
青少年编程与数学 02-020 C#程序设计基础 05课题、数据类型 一、数据类型及其意义1. 数据类型的概念1.1 值类型(Value Types)1.2 引用类型(Reference Types) 2. 数据类型的重要性2.1 类型安全示例 2.2 内存管理示例 2.3 性能优化示…...

React vs Vue.js:选哪个框架更适合你的项目?
摘要 前端开发江湖里,React 和 Vue.js 堪称两大 “顶流” 框架,不少开发者在选择时都犯了难。用 React 吧,听说它性能超强,可学习曲线也陡峭;选 Vue.js,有人夸它上手快,但又担心功能不够强大。…...

Kafka|基础入门
文章目录 快速了解Kafka快速上手Kafka理解Kafka的集群Kafka集群的消息流转模型 快速了解Kafka 快速上手Kafka 启动zookeeper 启动kafka 创建topic - 启动发送者 - 启动消费者 Partition 0: [msg1] -> [msg2] -> [msg3] -> ...0 1 2Partition 1: [msg4…...

ADS学习笔记(五) 谐波平衡仿真
参考书籍:见资源绑定,书籍4.2 谐波平衡仿真 本文为对实验内容的补充 1. 三阶交调点坐标系图分析 我们来分析图1.5中“三阶交调点”坐标系图里的两条直线分别代表什么。 图中有两条向上倾斜的直线: 斜率较低的那条直线代表:基波输出功率 (Fundamental Out…...
MySQL存储引擎对比及选择指南
MySQL 存储引擎是数据库底层管理数据存储和操作的核心组件,不同存储引擎在事务支持、性能、锁机制、存储方式等方面存在显著差异。以下是常见存储引擎的对比及其适用场景: 1. InnoDB 事务支持:支持 ACID 事务(COMMIT/ROLLBACK&am…...
【IDEA问题】springboot本地启动应用报错:程序包不存在;找不到符号
问题: springboot本地启动应用报错: 程序包xxx不存在;找不到符号 解决方案: 1.确保用maven重新导入依赖 2.删除.idea文件夹 3.invalidate caches里,把能选择的都勾选上,然后清除缓存重启 4.再在上方工具栏…...

PETR- Position Embedding Transformation for Multi-View 3D Object Detection
旷视 ECCV 2022 纯视觉BEV方案transformer网络3D检测 paper:[2203.05625] PETR: Position Embedding Transformation for Multi-View 3D Object Detection code:GitHub - megvii-research/PETR: [ECCV2022] PETR: Position Embedding Transformation …...

Prompt Tuning与自然语言微调对比解析
Prompt Tuning 与输入提示词自然语言微调的区别和联系 一、核心定义与区别 维度Prompt Tuning(提示微调)输入提示词自然语言微调本质优化连续向量空间中的提示嵌入(不可直接阅读)优化离散自然语言文本(人类可理解)操作对象模型输入嵌入层的连续向量(如WordEmbedding)自…...
二十七、面向对象底层逻辑-SpringMVC九大组件之HandlerAdapter接口设计
在 Spring MVC 框架中,HandlerAdapter 是一个看似低调却极为关键的组件。它的存在,不仅解决了不同类型处理器(Handler)的调用难题,更体现了框架设计中对解耦、扩展性和模块化的深刻思考。本文将从接口设计的角度&#…...

QT软件开发环境及简单图形的绘制-图形学(实验一)-[成信]
对于软件的安装这里就不多介绍了。 本文章主要是根据本校图形学的实验知道来做。 创建一个简单的计算机图形学程序 第一步:创建项目及配置 这里创建的项目名和类名尽量和我的一样,避免后面直接复制我的代码时会出现一些名字上面的错误。QtWidgetsAppl…...
项目部署一次记录
链路:(用户)客户端 → Nginx:192.168.138.100→ Tomcat (程序):192.168.138.101→ MySQL/Redis 打开数据库:systemctl start mysqld 重启网络: systemctl restart NetworkManager 关闭防火墙&am…...
单例模式,饿汉式,懒汉式,在java和spring中的体现
目录 饿汉式单例模式 懒汉式单例模式 Spring中的单例模式 关键差异对比 在Java和Spring中的应用场景 手写案例 单例模式是一种创建型设计模式,其核心在于确保一个类仅有一个实例,并提供一个全局访问点来获取该实例。下面将详细介绍饿汉式和懒汉式…...

一文带你彻底理清C 语言核心知识 与 面试高频考点:从栈溢出到指针 全面解析 附带笔者手写2.4k行代码加注释
引言:C 语言的魅力与挑战 从操作系统内核到嵌入式系统,从高性能计算到网络编程,C 语言高效、灵活和贴近硬件的特性,始终占据着不可替代的地位。然而,C 语言的强大也伴随着较高的学习曲线,尤其是指针、内存管…...
【Redis】第1节|Redis服务搭建
一、Redis 基础概念 核心功能 内存数据库,支持持久化(RDB/AOF)、主从复制、哨兵高可用、集群分片。常用场景:缓存、分布式锁、消息队列、计数器、排行榜等。 安装环境 依赖 GCC 环境(C语言编译)࿰…...

数据结构第5章 树与二叉树(竟成)
第 5 章 树与二叉树 【考纲内容】 1.树的基本概念 2.二叉树 (1)二叉树的定义及其主要特征 (2)二叉树的顺序存储结构和链式存储结构 (3)二叉树的遍历 (4)线索二叉树的基本概念和构造 …...

# 深入解析BERT自然语言处理框架:原理、结构与应用
深入解析BERT自然语言处理框架:原理、结构与应用 在自然语言处理(NLP)领域,BERT(Bidirectional Encoder Representations from Transformers)框架的出现无疑是一个重要的里程碑。它凭借其强大的语言表示能…...
ai学习--python部分-1.变量名及命名空间的存储
初学代码时总有一个问题困扰我:a 10 # a指向地址0x1234(存储10) 变量a的值10存储在0x1234,那么变量a需要存储吗?a又存储在什么地址呢 目录 1. 命名空间的本质 2. 命名空间的内存占用 3. …...

Cadence学习笔记之---PCB过孔替换、封装更新,DRC检查和状态查看
目录 01 | 引 言 02 | 环境描述 03 | 过孔替换 04 | 封装更新 05 | PCB状态查看 06 | DRC检查 07 | 总 结 01 | 引 言 终于终于来到了Cadence学习笔记的尾声! 在上一篇文章中,讲述了如何布线、如何铺铜,以及布线、铺铜过程中比较重要…...
Java基础 Day21
一、Stream 流 思想:流水线式思想 1、获取流对象(将数据放到流中) (1)集合获取 Stream 流对象 使用Collection接口的默认方法 default Stream<E> stream() 获取当前集合对象的 Stream 流(单列集…...

系统开发和运行知识
软件生存周期 软件生存周期包括可行性分析与项目开发计划、需求分析、概要设计、详细设计、编码和单元测试、综合测试及维护阶段。 1、可行性分析与项目开发计划 主要任务是确定软件的开发目标及可行性。该阶段应该给出问题定义、可行性分析和项目开发计划。 2、需求分析 需求…...
Elasticsearch 分片驱逐(Shard Exclusion)方式简析:`_name`、`_ip`、`_host`
在日常运维 Elasticsearch 集群过程中,常常需要将某个节点上的分片迁移出去,例如下线节点、腾出资源或进行维护操作。Elasticsearch 提供了简单直观的 shard exclusion 参数来实现这一目的,主要通过以下三个配置项: cluster.rout…...

【C++高级主题】异常处理(四):auto_ptr类
目录 一、auto_ptr 的诞生:为异常安全的内存分配而设计 1.1 传统内存管理的痛点 1.2 auto_ptr 的核心思想:RAII 与内存绑定 1.3 auto_ptr 的基本定义(简化版) 二、auto_ptr 的基本用法:将指针绑定到智能对象 2.1…...

STM32CubeMX配置使用通用定时器产生PWM
一、定时器PWM功能简介 定时器,顾名思义,就是定时的功能,定时器在单片机中算是除GPIO外最基本的外设。在ST中,定时器分为几种,基础定时器,通用定时器,高级定时器和低功耗定时器。其中定时器除了…...

WebSphere Application Server(WAS)8.5.5教程第十四讲:JPA
一、JPA 以下是对 JPA(Java Persistence API) 的深入详解,适用于具备一定 Java EE / Jakarta EE 背景的开发者,尤其是对数据持久化机制感兴趣的人员。 1、什么是 JPA? Java Persistence API(JPA…...