C# 与 相机连接
一、通过组件连接相机
需要提前在VisionPro里面保存一个CogAcqFifoTool相机工具为 .vpp
- 定义一个相机工具
CogAcqFifoTool mAcq = null;
- 将保存的相机工具放入mAcq中
string path = @“C:\Acq.vpp”;
mAcq = (CogAcqFifoTool)CogSerializer.LoadObjectFrommFile(path);
- 给窗口相机工具赋值(可有可无)
cogAcqFifoEditv21.Subject = mAcq;
- 点击进行拍照
if(mAcq.Operator != null){mAcq.Run(); // 运行相机工具ICogImage mImage = mAcq.OutputImage; // 获取图片// 显示图片CogRecordDisplay1.Image = mImageg;CogRecordDisplay1.Fit();
}
- 关闭相机释放资源
if(mAcq.Operator != null){mAcq.Operator.FrameGrabber.Disconnect(false);
}
二、使用类连接相机
- 封装
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 truefifo = 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}}}
}
- 调用方法
// 初始化相机
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);
- 调用完整代码
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 也有可能是200mswhile (cam1.CogImage == null)Thread.Sleep(10);//让当前线程休眠10mscogRecordDisplay1.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)