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)

相关推荐
mailtolaozhao2 小时前
C#入门--Hello world
开发语言·c#
王维志2 小时前
C# 中的 DateTime
开发语言·c#·.net
重生之我是Java开发战士2 小时前
【C语言】文件操作全解析
c语言·开发语言
驾驭人生2 小时前
C#中统计某个字符出现次数的最简单方法
c#
歪歪1006 小时前
HTML 如何转 Markdown
开发语言·chrome·python·程序人生·html
小坏坏的大世界7 小时前
C++中多线程和互斥锁的基本使用
开发语言·c++
路由侠内网穿透7 小时前
本地部署 SQLite 数据库管理工具 SQLite Browser ( Web ) 并实现外部访问
运维·服务器·开发语言·前端·数据库·sqlite
王者鳜錸7 小时前
PYTHON从入门到实践-18Django模版渲染
开发语言·python·django
Hard but lovely7 小时前
C++ STL--> vector的模拟实现!
开发语言·c++
hweiyu008 小时前
IDEA搭建GO环境
开发语言·后端·golang·intellij-idea·idea·intellij idea