C# 与 相机连接

一、通过组件连接相机

需要提前在VisionPro里面保存一个CogAcqFifoTool相机工具为 .vpp

  1. 定义一个相机工具
cs 复制代码
CogAcqFifoTool mAcq = null;
  1. 将保存的相机工具放入mAcq中
cs 复制代码
string path = @"C:\Acq.vpp";
mAcq = (CogAcqFifoTool)CogSerializer.LoadObjectFrommFile(apth);
  1. 给窗口相机工具赋值(可有可无)
cs 复制代码
cogAcqFifoEditv21.Subject = mAcq;
  1. 点击进行拍照
cs 复制代码
if(mAcq.Operator != null){
  mAcq.Run(); // 运行相机工具
  ICogImage mImage = mAcq.OutputImage;  // 获取图片
  // 显示图片
  CogRecordDisplay1.Image = mImageg;
  CogRecordDisplay1.Fit();
}
  1. 关闭相机释放资源
cs 复制代码
if(mAcq.Operator != null){
  mAcq.Operator.FrameGrabber.Disconnect(false);
}

二、使用类连接相机

  1. 封装
cs 复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using Cognex.VisionPro;


namespace Pro20250118_Cognex接口连接相机
{
    public class Camera
    {

        public ICogFrameGrabber grabber = null;//硬件
        public ICogAcqFifo fifo = null;//采集接口

        //图像采集完成,传递图片的事件
        public event Action<ICogImage> OnCompleted;

        public ICogImage CogImage { get; set; } = null;
        
        /// <summary>
        /// 初始化相机
        /// </summary>
        public void InitialCam()
        {
            //1. 枚举所有的已连接的硬件
            CogFrameGrabbers frameGrabbers =new CogFrameGrabbers();
            //CogFrameGrabbers 是一个集合类对象,当只有一个相机的时候,我们使用frameGrabbers[0]这个对象
            if (frameGrabbers.Count < 1)
            {
                MessageBox.Show("没有搜寻到相机");
                return;
            }

            try
            {
                //2. 给硬件对象赋值
                grabber = frameGrabbers[0];//赋值相机对象
                //3. 创建采集接口
                //参数1 视频格式 可以参考vp工具初始化相机时的视频格式 参数2 图像格式 参数3 0 参数4 true
                fifo = grabber.CreateAcqFifo("Generic GigEVision (Mono)", CogAcqFifoPixelFormatConstants.Format8Grey, 0, true);

                fifo.OwnedExposureParams.Exposure = 10;//设置曝光时间为10ms
                //4. 添加采集完成事件
                fifo.Complete += Fifo_Complete;
            }
            catch (Exception ex)
            {
                MessageBox.Show("相机初始化失败");
            }
        }

        int count;
        //采集完成并创建图像
        private void Fifo_Complete(object sender, CogCompleteEventArgs e)
        {
            int numPendingVal, numReadyVal;
            bool busyVal;
            try
            {
                ICogImage image = null;
                CogAcqInfo info = new CogAcqInfo();//创建一个采集信息
                fifo.GetFifoState(out numPendingVal, out numReadyVal, out busyVal);//获取采集状态
                if (numReadyVal > 0)
                {
                    image = fifo.CompleteAcquireEx(info);//获取图像
                    CogImage = image; 


                    OnCompleted?.Invoke(image);//触发事件,传递图片
                    count++;
                }

                if (count>3) 
                {
                    GC.Collect();//采集三次以后gc回收一下
                }
            }
            catch (Exception)
            {

                
            }
        }

        /// <summary>
        /// 相机拍照
        /// </summary>
        public void CamRun()
        {
            if (fifo != null)
                fifo.StartAcquire();
        }

        /// <summary>
        /// 关闭相机
        /// </summary>
        public void CloseCam()
        {
            CogFrameGrabbers frameGrabbers = new CogFrameGrabbers();
            foreach (ICogFrameGrabber fg in frameGrabbers)
            {
                fg.Disconnect(true);//相机断开连接
            }
        }

        public void SetExposure(double exp)
        {
            if (fifo != null)
            {
                fifo.OwnedExposureParams.Exposure = exp;//设置相机的曝光时间, 单位是ms
            }
        }


    }
}
  1. 调用方法
cs 复制代码
// 初始化相机
Camera cam1 = new Camera();
cam1.InitialCam();//初始化相机

// 采集图像
cam1.CamRun();//采集图像是有时间的,有可能是100ms 也有可能是200ms

// 获取图片
cogRecordDisplay1.Image = null;
cogRecordDisplay1.Image = cam1.CogImage;
cogRecordDisplay1.Fit();
cam1.CogImage = null;

// 关闭相机释放资源
cam1.CloseCam();

// 设置相机的曝光时间
cam1.SetExposure(2);
  1. 调用完整代码
cs 复制代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Pro20250118_Cognex接口连接相机
{
    public partial class FrmMain : Form
    {
        Camera cam1 = new Camera();

        public FrmMain()
        {
            InitializeComponent();
        }
       
        //窗体加载事件
        private void FrmMain_Load(object sender, EventArgs e)
        {
            cam1.InitialCam();//初始化相机
            cam1.OnCompleted += Cam1_OnCompleted;
        }

        private void Cam1_OnCompleted(Cognex.VisionPro.ICogImage image)
        {
            //cogRecordDisplay1.Image = null;
            //cogRecordDisplay1.Image = image;
            //cogRecordDisplay1.Fit();
        }

        //拍照按钮click事件
        private void btnTrigger_Click(object sender, EventArgs e)
        {
            cam1.CamRun();//采集图像是有时间的,有可能是100ms 也有可能是200ms

            while (cam1.CogImage == null)
                Thread.Sleep(10);//让当前线程休眠10ms

            cogRecordDisplay1.Image = null;
            cogRecordDisplay1.Image = cam1.CogImage;
            cogRecordDisplay1.Fit();
            cam1.CogImage = null;
        }

        private void FrmMain_FormClosed(object sender, FormClosedEventArgs e)
        {
            cam1.CloseCam();
        }

        private void btnSetExp_Click(object sender, EventArgs e)
        {
            cam1.SetExposure(double.Parse(textBox1.Text.Trim()));
        }
    }
}

三、选择生成的平台

项目------属性------生成------目标平台(我选x64)

相关推荐
钢铁男儿2 分钟前
C#:创建变量和类的实例
c#
大G哥12 分钟前
Java 中的 Integer 缓存池:背后的性能优化机制解析
java·开发语言·缓存·性能优化
小虚竹34 分钟前
claude 3.7,极为均衡的“全能型战士”大模型,国内直接使用
开发语言·后端·claude·claude3.7
牛马baby42 分钟前
Java高频面试之并发编程-11
java·开发语言·面试
huangyuchi.1 小时前
【C++11】类的新功能
开发语言·笔记·c++11·delete·移动构造·移动赋值·deflut
s9123601011 小时前
Rust std::thread::spawn(move) 的作用
开发语言·后端·rust
XWXnb61 小时前
STM32 中断系统深度剖析
c语言·开发语言·stm32·嵌入式硬件
冼紫菜1 小时前
Spring Cloud 项目中优雅地传递用户信息:基于 Gateway + ThreadLocal 的用户上下文方案
java·开发语言·spring boot·后端·spring cloud·gateway
了一li1 小时前
C#中用 OxyPlot 在 WinForms 实现波形图可视化(附源码教程)
开发语言·c#
大模型铲屎官2 小时前
Unity C# 与 Shader 交互入门:脚本动态控制材质与视觉效果 (含 MaterialPropertyBlock 详解)(Day 38)
c语言·unity·c#·交互·游戏开发·材质·shader