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