当前位置: 首页 > news >正文

C# 与 相机连接

一、通过组件连接相机

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

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

二、使用类连接相机

  1. 封装
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. 调用方法
// 初始化相机
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. 调用完整代码
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)
在这里插入图片描述

http://www.dtcms.com/a/109309.html

相关文章:

  • 接收灵敏度的基本概念与技术解析
  • 【计网】作业三
  • 2025年2月,美国发布了新版移动灯的安规标准:UL153标准如何办理?
  • MySQL:库表操作
  • CATIA装配体全自动存储解决方案开发实战——基于递归算法的产品结构树批量处理技术
  • 一款非常小的软件,操作起来非常丝滑!
  • 语音识别播报人工智能分类垃圾桶(论文+源码)
  • MySQL 基础使用指南-MySQL登录与远程登录
  • MySQL超全笔记
  • 快速掌握MCP——Spring AI MCP包教包会
  • Pyspark学习二:快速入门基本数据结构
  • 4月3号.
  • Python 函数知识梳理与经典编程题解析
  • FFmpeg录制屏幕和音频
  • 单片机学习之定时器
  • 嵌入式海思Hi3861连接华为物联网平台操作方法
  • Zapier MCP:重塑跨应用自动化协作的技术实践
  • 【Linux】Orin NX + Ubuntu22.04配置国内源
  • 如何实现一个优雅的Go协程池
  • ORION:基于VLM引导动作生成的端到端框架——论文精度
  • 源码分析之Leaflet图层控制控件Control.Layers实现原理
  • 量子计算与人工智能的结合:未来科技的双重革命
  • 人工智能混合编程实践:C++ ONNX进行图像超分重建
  • 从零实现Json-Rpc框架】- 项目实现 - 服务端主题实现及整体封装
  • “清凉海岛·创享一夏” 海南启动旅游线路产品创意设计大赛
  • 【C语言】strstr查找字符串函数
  • 基于milvus安装--可视化工具 attu
  • PyQt6实例_A股日数据维护工具_子窗体
  • 深入理解浏览器的事件循环
  • CentOS7 安装Redis