4 联合编程

4 联合编程

C#连接相机

  1. 添加相关的VisionPro控件

    1. 打开vs
    2. 在工具箱中右键 => 选择项 => 勾选CogAcqFifoEditV2(配置相机)、CogRecordDisplay(图片展示工具)​​
  2. 将上面添加的两个控件都拖到窗体的合适位置

  3. 隐藏代码中配置如下代码

    // 取相工具
    CogAcqFifoTool acqFifoTool = new CogAcqFifoTool();
    // 窗体加载事件
    private void Form1_Load(object sender, EventArgs e)
    {
      // 设置相机配置工具的工作目标为取相工具
      acqFifoTool.Subject = cogAcqFifoTool1;
    }
    // 拍照按钮点击事件
    private void button1_Click(object sender, EventArgs e)
    {
      // 运行取相工具
      acqFifoTool.Run();
      // 获取取相工具的输出图像并赋值给图像展示工具
      cogRecordDisplay1.Image = acqFifoTool.OutputImage;
      // 自适应
      cogRecordDisplay1.Fit();
    }
    // 窗体关闭事件
    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
      // 如果取相工具有相机
      if (acqFifoTool.Operator != null)
      {
        // 应该将相机释放
        acqFifoTool.Operator?.FrameGrabber.Disconnect(false);
      }
    }
    

使用ICogFrameGrabber连接相机

  • CogFrameGrabbers fgs = new CogFrameGrabbers();​ 获取所有图像采集设备,可迭代,有索引器

  • ICogFrameGrabber.Disconnect(false)​ 释放相机,应该在窗体关闭的事件中释放所有相机的连接

  • ICogAcqFifo fifo = grabber.CreateAcqFifo("Generic GigEVision (Mono)", CogAcqFifoPixelFormatConstants.Format8Grey, 0, true)​ 创建图像采集对象,并配置相关信息

    • 参数1:视频格式
    • 参数2:采集图像类型
    • 参数3:是否自动准备
  • ICogAcqFifo.Complete​事件,图像采集完成将会触发该事件

  • ICogAcqFifo.GetFifoState(out int numPending, out int numReady, out bool busy)​ 获取FIFO状态,包括待处理和已准备图像数量以及是否繁忙

  • ICogAcqFifo.CompleteAcquireEx(CogAcqInfo)​ 获取当前采集的图像

  • ICogAcqFifo.StartAcquire()​ 开始进行图像采集,采集完成将会触发Complete事件

  • int ICogAcqFifo.OwnedExposureParams.Exposure​ 读取或这是图像采集对象的曝光度

  • double ICogAcqFifo.OwnedContrastParams.Contrast​ 读取或这是图像采集对象的对比度(范围0-1)

  • CogRecordDisplay.StartLiveDisplay(ICogAcqFifo)​ 在该控件上进行实时图像采集

  • CogRecordDisplay.StopLiveDisplay()​ 停止实时采集

下面是一个连接相机、拍照、实时预览、设置曝光、设置对比度的示例

// 存储所有的采集设备信息
CogFrameGrabbers fgs;
// 存储当前选中的采集设备信息
ICogFrameGrabber grabber;
// 存储由采集设备创建的图像抓取对象
ICogAcqFifo fifo;
// 窗体加载时
private void Form1_Load(object sender, EventArgs e)
{
    // 获取所有的可用设备
    fgs = new CogFrameGrabbers();
    // 循环添加到下拉菜单中
    foreach (ICogFrameGrabber item in fgs)
    {
        comboBox1.Items.Add(item.Name);
    }
}
// 下拉菜单选项变化时
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    if (comboBox1.SelectedIndex != -1 && fgs.Count != 0)
    {
        // 获取当前选中的采集设备信息
        grabber = fgs[comboBox1.SelectedIndex];
        // 创建图像采集对象,并配置
        // 参数1:视频格式
        // 参数2:采集图像类型
        // 参数3:是否自动准备
        fifo = grabber.CreateAcqFifo("Generic GigEVision (Mono)", CogAcqFifoPixelFormatConstants.Format8Grey, 0, true);
        // 监听Complete事件,图像采集完成将会触发该事件
        fifo.Complete += Fifo_Complete;
    }
}
private void Fifo_Complete(object sender, CogCompleteEventArgs e)
{
    // 获取FIFO状态,包括待处理和已准备图像数量以及是否繁忙
    fifo.GetFifoState(out int numPending, out int numReady, out bool busy);
    // 如果已准备图像数量大于0
    if(numReady > 0)
    {
        // 停止实时显示
        cogRecordDisplay1.StopLiveDisplay();
        // 获取并显示已准备好的图像
        cogRecordDisplay1.Image = fifo.CompleteAcquireEx(new CogAcqInfo());
    }
}
private void button1_Click(object sender, EventArgs e)
{
    if (fifo == null) return;
    fifo.StartAcquire();    // 开始进行图像采集,采集完成将会触发Complete事件
}
private void button2_Click(object sender, EventArgs e)
{
    // 开始实时预览
    cogRecordDisplay1.StartLiveDisplay(fifo);
}
private void button3_Click(object sender, EventArgs e)
{
    // 停止实时预览
    cogRecordDisplay1.StopLiveDisplay();
}
private void button4_Click(object sender, EventArgs e)
{
    int bg = int.Parse(textBox1.Text);
    // 设置曝光
    fifo.OwnedExposureParams.Exposure = bg;
}
private void button6_Click(object sender, EventArgs e)
{
    double dbd = double.Parse(textBox3.Text);
    // 设置对比度(范围0-1)
    fifo.OwnedContrastParams.Contrast = dbd;
}

posted @ 2024-10-11 14:49  讨厌敲代码的老郭  阅读(18)  评论(0编辑  收藏  举报