VisionPro 与 C# 联合编程:相机连接实战指南

news2025/5/29 10:22:17

在工业视觉检测与自动化领域,康耐视(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();
        }
    }
}
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2386922.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

论文阅读: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)&…

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…

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)自…

QT软件开发环境及简单图形的绘制-图形学(实验一)-[成信]

对于软件的安装这里就不多介绍了。 本文章主要是根据本校图形学的实验知道来做。 创建一个简单的计算机图形学程序 第一步:创建项目及配置 这里创建的项目名和类名尽量和我的一样,避免后面直接复制我的代码时会出现一些名字上面的错误。QtWidgetsAppl…

一文带你彻底理清C 语言核心知识 与 面试高频考点:从栈溢出到指针 全面解析 附带笔者手写2.4k行代码加注释

引言:C 语言的魅力与挑战 从操作系统内核到嵌入式系统,从高性能计算到网络编程,C 语言高效、灵活和贴近硬件的特性,始终占据着不可替代的地位。然而,C 语言的强大也伴随着较高的学习曲线,尤其是指针、内存管…

数据结构第5章 树与二叉树(竟成)

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

# 深入解析BERT自然语言处理框架:原理、结构与应用

深入解析BERT自然语言处理框架:原理、结构与应用 在自然语言处理(NLP)领域,BERT(Bidirectional Encoder Representations from Transformers)框架的出现无疑是一个重要的里程碑。它凭借其强大的语言表示能…

Cadence学习笔记之---PCB过孔替换、封装更新,DRC检查和状态查看

目录 01 | 引 言 02 | 环境描述 03 | 过孔替换 04 | 封装更新 05 | PCB状态查看 06 | DRC检查 07 | 总 结 01 | 引 言 终于终于来到了Cadence学习笔记的尾声! 在上一篇文章中,讲述了如何布线、如何铺铜,以及布线、铺铜过程中比较重要…

系统开发和运行知识

软件生存周期 软件生存周期包括可行性分析与项目开发计划、需求分析、概要设计、详细设计、编码和单元测试、综合测试及维护阶段。 1、可行性分析与项目开发计划 主要任务是确定软件的开发目标及可行性。该阶段应该给出问题定义、可行性分析和项目开发计划。 2、需求分析 需求…

【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&#xf…

Linux系统调用深度剖析

Linux系统调用深度剖析与实践案例 目录 Linux系统调用深度剖析与实践案例 一、Linux系统调用概述 二、进程管理相关系统调用 1. fork():进程克隆与多任务处理 2. exec系列:程序加载与替换 3. wait/waitpid:进程状态同步 三、文件操作相关系统调用 1. 文件描述符操作…

动态规划-918.环形子数组的最大和-力扣(LeetCode)

一、题目解析 听着有点复杂,这里一图流。 将环形问题转化为线性问题。 二、算法原理 1.状态表示 2.状态转移方程 详细可以移步另一篇博客,53. 最大子数组和 - 力扣(LeetCode) 3.初始化 由于计算中需要用到f[i-1]和g[i-1]的值&…

STM32:Modbus通信协议核心解析:关键通信技术

知识点1【 Modbus通信】 1、Modbus的概述 Modbus是OSI模型第七层的应用层报文传输协议 协议:说明有组包和解包的过程 2、通信机制 Modelbus是一个请求/应答协议 通信机制:主机轮询,从机应答的机制。每个从设备有唯一的地址,主…