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)

相关推荐
段一凡-华北理工大学12 小时前
向量数据库实战:选型、调优与落地~系列文章12:文本分块策略实战:chunk_size 怎么选?重叠多少?
开发语言·数据库·后端·oracle·rust·工业智能体·高炉智能化
Ljwuhe12 小时前
C++——多态
开发语言·c++
心平气和量大福大13 小时前
C#-WPF-Window主窗体
开发语言·c#·wpf
白露与泡影13 小时前
Arthas 实战指南:从方法耗时定位到 JVM 变量热修改
服务器·jvm·c#
从零开始的代码生活_14 小时前
C++ 继承详解:访问控制、对象模型、菱形继承与设计取舍
开发语言·c++·后端·学习·算法
云小逸14 小时前
【C++ 第七阶段:模板、泛型编程与工程综合详解】
开发语言·c++
GIS阵地15 小时前
QgsSingleBandPseudoColorRenderer 完整详解(QGIS 3.40.13 C++)
开发语言·前端·c++·qt·qgis
yaoxin52112315 小时前
470. Java 反射 - Member 接口与 AccessFlag
java·开发语言·python
groundhappy15 小时前
idalib安装和codex ida-mcp配置
linux·开发语言·python
小钻风336616 小时前
Spring Boot 文件上传详解:深入理解 MultipartFile 的使用与原理
java·开发语言