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)

相关推荐
月巴月巴白勺合鸟月半10 分钟前
一个DevExpress的Docx文件处理的Bug的解决
c#·bug
移远通信1 小时前
常见问题解答
开发语言·php
初见无风1 小时前
3.1 Lua代码中的元表与元方法
开发语言·lua·lua5.4
逻极1 小时前
Rust流程控制(上):if_else与match模式匹配
开发语言·后端·rust
小雨下雨的雨1 小时前
Rust专项——其他集合类型详解:BTreeMap、VecDeque、BinaryHeap
开发语言·后端·rust
渡我白衣1 小时前
C++世界的混沌边界:undefined_behavior
java·开发语言·c++·人工智能·深度学习·语言模型
星辰大海14121 小时前
摄影入门学习笔记
笔记·数码相机·学习
格林威1 小时前
AOI在人形机器人制造领域的应用
人工智能·数码相机·算法·目标跟踪·机器人·视觉检测·制造
剑海风云1 小时前
JDK 26:HTTP/3 支持已可在 HTTP 客户端 API 中使用
java·开发语言·http
.NET修仙日记2 小时前
第一章:从零开始构建你的第一个C#/.NET应用程序
c#·.net·.net core