【机械视觉】C#+VisionPro联合编程之连接硬件工业相机———【七、分享两种C#+VisionPro抓取相机并操作的方式】(本文有介绍CogFrameGrabbers相机抓取类)

C#+VisionPro获取相机并操作的方式

目录

C#+VisionPro获取相机并操作的方式

前言:

获取相机并操作的方式一

第一步、在visionPro中使用cogacqfifotool工具检测详解并配置相机,然后将工具保存本地。

第二步、创建winform项目并且搭建winform窗体

第三步、创建Load事件使用CogSerializer.LoadObjectFromFile()方式进行加载cogacqfifotool工具

第四步、创建实时显示按钮的click事件并实现预览效果(展示在cogRecordDisplay1控件上)

第五步、实现拍照功能(双击拍照按钮创建click事件)

第六步、实现保存功能(双击保存按钮创建click事件)

第七步、窗体关闭时释放相机(formclosing窗体关闭事件)

第八步、将项目生成目标平台改为x64

完整代码(源码)

获取相机并操作的方式二

第一步、创建winform项目并且搭建winform窗体

第二步、通过CogFrameGrabbers类进行抓取相机,并且进行操作加载

CogFrameGrabbers介绍:

CogFrameGrabbers的使用:

第三步、实现实时预览(双击实时按钮订阅click事件)

第四步、实现拍照功能(双击拍照按钮订阅click事件)

第五步、实现配置相机功能(双击配置参数按钮订阅click事件)

第六步、关闭窗体时释放相机对象

 第七步、将项目生成目标平台改为x64

完整代码(源码)


前言:

  • 本文通过使用两个小例子介绍两种抓取相机的方式。
  • 第一种抓取方式是通过visionPro中的cogacqfifotool工具进行检测相机,并且进行配置,配置完成后将工具保存本地用于在WINFORM中加载。
  • 第二种方式是在C#中通过Cognex.VisionPro.CogFrameGrabbers类进行抓取相机,然后通过抓取到的相机对象创建ICogAcqFifo相机采集接口。从而进行操作。

本两次方式教程都省略了连接相机的前两步操作(硬件连接和软件配置)。直接进行操作硬件工业相机。

如果不懂得如何连接工业相机的话可以先看一下网站进行学习【机械视觉】C#+VisionPro联合编程———【六、visionPro连接工业相机设备】-优快云博客


获取相机并操作的方式一

第一种方式是通过visionPro中的cogacqfifotool工具进行检测相机,并且进行配置,配置完成后将工具保存本地用于在WINFORM中加载。

第一步、在visionPro中使用cogacqfifotool工具检测详解并配置相机,然后将工具保存本地。

第二步、创建winform项目并且搭建winform窗体

在winform中创建两个cog的工具一个cogRecordDisplay用于预览,一个cogAcqFifoEditV2工具用于展示相机。

第三步、创建Load事件使用CogSerializer.LoadObjectFromFile()方式进行加载cogacqfifotool工具

加载工具的本地文件,然后赋值给cogAcqFifoEditV2相机控件。

// 全局相机工具
public CogAcqFifoTool fifo;
// 加载
private void Form1_Load(object sender, EventArgs e)
{
    // 加载acq工具
    // 加载vpp转成CogAcqFifoTool类型
    fifo = CogSerializer.LoadObjectFromFile(@"C:\2.vpp") as CogAcqFifoTool;
    // 显示相机控件中
    cogAcqFifoEditV21.Subject = fifo;
}

第四步、创建实时显示按钮的click事件并实现预览效果(展示在cogRecordDisplay1控件上)

// 实时显示
private void button2_Click(object sender, EventArgs e)
{
    if(this.button2.Text == "实时显示")
    {
        button2.Text = "关闭实时";
        // StartLiveDisplay() 使用指定的采集FIFO开始实时图像显示  参数1是相机 
        cogRecordDisplay1.StartLiveDisplay(fifo.Operator,false);
    }
    else
    {
        button2.Text = "实时显示";
        // StopLiveDisplay() 停止实时图像显示
        cogRecordDisplay1.StopLiveDisplay();
    }
}

第五步、实现拍照功能(双击拍照按钮创建click事件)

运行CogAcqFifoTool 全局相机工具,将输出图片存储在变量中,再显示到cogRecordDisplay1控件中。

// 全局图片
public ICogImage images;
// 拍照
private void button1_Click(object sender, EventArgs e)
{
    // 判断相机是否为空
    if (fifo == null) return;
    // 运行拍照工具
    fifo.Run();
    // 把图片进行显示
    images = fifo.OutputImage;
    // 显示图片
    cogRecordDisplay1.Image = images;
    cogRecordDisplay1.Fit();
}

第六步、实现保存功能(双击保存按钮创建click事件)

以下分享了两种保存图片方式:

第一种是使用visionPro 提供的专用工具CogImageFileTool进行实现。

第二种是使用.NET 标准库中的图像处理类System.Drawing.Bitmap进行实现。

// 保存
private void button3_Click(object sender, EventArgs e)
{
    SaveImage1(images);
    SaveImage2(cogRecordDisplay1);
}

// 保存图片1
public void SaveImage1(ICogImage image)
{
    string path = Directory.GetCurrentDirectory() + @"/image";
    if (!Directory.Exists(path))
    {
        Directory.CreateDirectory(path);
    }
    // 图片名字
    string picName = $"{DateTime.Now.ToString("yyyy-MM-dd-hh-mm-ss")}"+".png";

    // 创建fileTool工具
    CogImageFileTool cogImageFileTool = new CogImageFileTool();

    // 设置工具的输入图
    cogImageFileTool.InputImage = image;
    Console.WriteLine($"{path}\\{picName}");

    // 保存图片
    cogImageFileTool.Operator.Open($"{path}\\{picName}", CogImageFileModeConstants.Write);

    // 运行工具
    cogImageFileTool.Run();
}

// 保存图片2
public void SaveImage2(CogRecordDisplay dis)
{
    string path = Directory.GetCurrentDirectory() + @"/image";
    if (!Directory.Exists(path))
    {
        Directory.CreateDirectory(path);
    }
    // 图片名字
    string picName = $"{DateTime.Now.ToString("yyyy-MM-dd-hh-mm-ss")}" + ".png";

    // 把dis展示图片取出转成位图
    Bitmap map = (Bitmap)dis.CreateContentBitmap(Cognex.VisionPro.Display.CogDisplayContentBitmapConstants.Image);
    // 保存图片
    map.Save($"{path}\\{picName}");
}

第七步、窗体关闭时释放相机(formclosing窗体关闭事件)

// 关闭窗体时候 释放相机
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    if (fifo.Operator != null) // 相机存在 释放相机
    {
        fifo.Operator.FrameGrabber.Disconnect(false);
    }
}

第八步、将项目生成目标平台改为x64

完整代码(源码)

public partial class Form1 : Form
{
    // 全局相机工具
    public CogAcqFifoTool fifo;
    // 全局图片
    public ICogImage images;

    public Form1()
    {
        InitializeComponent();
    }
    // 拍照
    private void button1_Click(object sender, EventArgs e)
    {
        // 判断相机是否为空
        if (fifo == null) return;
        // 运行拍照工具
        fifo.Run();
        // 把图片进行显示
        ICogImage image = fifo.OutputImage;
        images = image;
        // 显示图片
        cogRecordDisplay1.Image = images;
        cogRecordDisplay1.Fit();

    }

    // 实时显示
    private void button2_Click(object sender, EventArgs e)
    {
        if(this.button2.Text == "实时显示")
        {
            button2.Text = "关闭实时";
            // StartLiveDisplay() 使用指定的采集FIFO开始实时图像显示
            cogRecordDisplay1.StartLiveDisplay(fifo.Operator,false);
        }
        else
        {
            button2.Text = "实时显示";
            // StopLiveDisplay() 停止实时图像显示
            cogRecordDisplay1.StopLiveDisplay();
        }
    }

    // 保存
    private void button3_Click(object sender, EventArgs e)
    {
        SaveImage1(images);
        SaveImage2(cogRecordDisplay1);
    }

    public void SaveImage1(ICogImage image)
    {
        string path = Directory.GetCurrentDirectory() + @"/image";
        if (!Directory.Exists(path))
        {
            Directory.CreateDirectory(path);
        }
        // 图片名字
        string picName = $"{DateTime.Now.ToString("yyyy-MM-dd-hh-mm-ss")}"+".png";

        // 创建fileTool工具
        CogImageFileTool cogImageFileTool = new CogImageFileTool();

        // 设置工具的输入图
        cogImageFileTool.InputImage = image;
        Console.WriteLine($"{path}\\{picName}");

        // 保存图片
        cogImageFileTool.Operator.Open($"{path}\\{picName}", CogImageFileModeConstants.Write);

        // 运行工具
        cogImageFileTool.Run();

    }

    // 保存图片2
    public void SaveImage2(CogRecordDisplay dis)
    {
        string path = Directory.GetCurrentDirectory() + @"/image";
        if (!Directory.Exists(path))
        {
            Directory.CreateDirectory(path);
        }
        // 图片名字
        string picName = $"{DateTime.Now.ToString("yyyy-MM-dd-hh-mm-ss")}" + ".png";

        // 把dis展示图片取出转成位图
        Bitmap map = (Bitmap)dis.CreateContentBitmap(Cognex.VisionPro.Display.CogDisplayContentBitmapConstants.Image);
        // 保存图片
        map.Save($"{path}\\{picName}");

    }

    // 封装加载vpp的方法
    public void LoadVPP()
    {
        // 加载vpp转成CogAcqFifoTool类型
        fifo = CogSerializer.LoadObjectFromFile(@"C:\Users\Administrator\Desktop\获取图像方法Acq、封装图像方法—李昊轩\1-使用acq进行拍照\bin\Debug\2.vpp") as CogAcqFifoTool;
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        // 加载acq工具
        LoadVPP();
        // 显示相机控件中
        cogAcqFifoEditV21.Subject = fifo;
    }
    // 关闭窗体时候 释放相机
    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        if (fifo.Operator != null) // 相机存在 释放相机
        {
            fifo.Operator.FrameGrabber.Disconnect(false);
        }
    }
}


获取相机并操作的方式二

第二种方式是在C#中通过Cognex.VisionPro.CogFrameGrabbers类进行抓取相机,然后通过ICogAcqFifo类型来接收相机。从而进行操作。

第一步、创建winform项目并且搭建winform窗体

在winform中创建两个cog的工具一个cogRecordDisplay用于预览,三个按钮用于拍照,实时,配置参数功能。

第二步、通过CogFrameGrabbers类进行抓取相机,并且进行操作加载

CogFrameGrabbers介绍:
  • CogFrameGrabbers类的作用是获取已经连接的硬件,它是连接图像采集硬件(如相机)与VisionPro软件的关键桥梁,使得软件能够获取并处理来自相机的图像数据。
CogFrameGrabbers的使用:
  • 1-抓取已连接相机CogFrameGrabbers frame = new CogFrameGrabbers();,返回的是一个集合对象。
  • 2-抓取完相机后可以如果连接的是一个相机可以直接frame[0]获取相机第一个元素即可,如果是多个相机则需要遍历获取。
  • 3-可以使用抓取到的相机对象调用CreateAcqFifo()方法创建ICogAcqFifo相机采集接口变量
  • 4-通过ICogAcqFifo相机接口变量订阅Complete图像采集完成事件。
  • 5-通过Complete事件获取采集完的图像并进行展示。
  • 6-通过ICogAcqFifo相机接口变量调用StartAcquire()方法,开启图像采集,实现拍照功能。
// 加载
private void Form1_Load(object sender, EventArgs e)
{
    Init();
}

public ICogFrameGrabber myGrabber; // 当前相机对象
public ICogAcqFifo myAcqFifo; // vp相机的工具
// 初始化相机
public void Init()
{
    // 创建抓取帧对象
    CogFrameGrabbers frame = new CogFrameGrabbers();

    // 判断是否有相机
    if (frame.Count < 1)
    {
        MessageBox.Show("没有搜索到可用的相机");
        return;
    }

    // 如果连接多个相机(通过遍历获取)
    //foreach (ICogFrameGrabber item in frame)
    //{
    //    ICogFrameGrabber I1 = item;
    //}

    // 如果只有一个相机
    myGrabber = frame[0];
    // CreateAcqFifo() 创建相机采集接口
    // 参数1 视频格式
    // 参数2 图像的类型
    // 参数3 相机端口
    // 参数4 自动预处理
    myAcqFifo = myGrabber.CreateAcqFifo("Generic GigEVision (Mono)",CogAcqFifoPixelFormatConstants.Format8Grey,0,true);
    // 图像采集完成事件,当图像采集完成后要进行的事件
    myAcqFifo.Complete += MyAcqFifo_Complete;
}
// 图像采集完成事件
private void MyAcqFifo_Complete(object sender, CogCompleteEventArgs e)
{
    try
    {
        int numPending, numReady; // 等待状态,准备状态
        bool isBusy; // 繁忙状态
        // 获取当前 相机的状态
        myAcqFifo.GetFifoState(out numPending, out numReady, out isBusy);
        if (numReady > 0) // 判断相机是否准备好
        {
            CogAcqInfo info = new CogAcqInfo(); // 创建acqinfo对象
            ICogImage image = myAcqFifo.CompleteAcquireEx(info); // 获取图像 
            cogRecordDisplay1.Image = image; // 显示图片
            cogRecordDisplay1.Fit();
        }
    }
    catch (Exception)
    {
        throw new Exception("采集信息失败");
    }
}

第三步、实现实时预览(双击实时按钮订阅click事件)

/// <summary>
///实时
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
{
    cogRecordDisplay1.StartLiveDisplay(myAcqFifo);
    cogRecordDisplay1.Fit();
}

第四步、实现拍照功能(双击拍照按钮订阅click事件)

通过ICogAcqFifo相机接口变量调用StartAcquire()方法,开启图像采集,实现拍照功能。

/// <summary>
/// 拍照
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
    myAcqFifo.StartAcquire(); // 开始采集图片像素
}

第五步、实现配置相机功能(双击配置参数按钮订阅click事件)

通过ICogAcqFifo相机接口变量配置相机参数

// 配置相机
private void button3_Click(object sender, EventArgs e)
{
    myAcqFifo.OwnedExposureParams.Exposure = Convert.ToDouble(textBox1.Text);
    // 设置亮度参数
    myAcqFifo.OwnedBrightnessParams.Brightness = Convert.ToDouble(textBox2.Text);

    // 设置对比度
    // myAcqFifo.OwnedContrastParams.Contrast = 0;
}

第六步、关闭窗体时释放相机对象

// 关闭
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    // 关闭事件释放相机
    if (myGrabber == null) return;
    myGrabber.Disconnect(false);
}

 第七步、将项目生成目标平台改为x64

完整代码(源码)

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    /// <summary>
    /// 拍照
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void button1_Click(object sender, EventArgs e)
    {
        myAcqFifo.StartAcquire(); // 开始采集图片像素
    }

    /// <summary>
    ///实时
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void button2_Click(object sender, EventArgs e)
    {
        cogRecordDisplay1.StartLiveDisplay(myAcqFifo);
        cogRecordDisplay1.Fit();
    }

    // 加载
    private void Form1_Load(object sender, EventArgs e)
    {
        Init();
    }
    // 初始化相机
    public ICogFrameGrabber myGrabber; // 当前相机对象
    public ICogAcqFifo myAcqFifo; // vp相机的工具
    public void Init()
    {
        // 创建抓取帧对象
        CogFrameGrabbers frame = new CogFrameGrabbers();

        // 判断是否有相机
        if (frame.Count < 1)
        {
            MessageBox.Show("没有搜索到可用的相机");
            return;
        }

        // 如果连接多个相机(通过遍历获取)
        //foreach (ICogFrameGrabber item in frame)
        //{
        //    ICogFrameGrabber I1 = item;
        //}

        // 如果只有一个相机
        myGrabber = frame[0];
        // CreateAcqFifo() 创建相机采集接口
        // 参数1 视频格式
        // 参数2 图像的类型
        // 参数3 相机端口
        // 参数4 自动预处理
        myAcqFifo = myGrabber.CreateAcqFifo("Generic GigEVision (Mono)",CogAcqFifoPixelFormatConstants.Format8Grey,0,true);
        // 图像采集完成事件,当图像采集完成后要进行的事件
        myAcqFifo.Complete += MyAcqFifo_Complete;
    }
    // 图像采集完成事件
    private void MyAcqFifo_Complete(object sender, CogCompleteEventArgs e)
    {
        try
        {
            int numPending, numReady; // 等待状态,准备状态
            bool isBusy; // 繁忙状态
            // 获取当前 相机的状态
            myAcqFifo.GetFifoState(out numPending, out numReady, out isBusy);
            if (numReady > 0) // 判断相机是否准备好
            {
                CogAcqInfo info = new CogAcqInfo(); // 创建acqinfo对象
                ICogImage image = myAcqFifo.CompleteAcquireEx(info); // 获取图像 
                cogRecordDisplay1.Image = image; // 显示图片
                cogRecordDisplay1.Fit();
            }
        }
        catch (Exception)
        {
            throw new Exception("采集信息失败");
        }
    }

    // 关闭
    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        // 关闭事件释放相机
        if (myGrabber == null) return;
        myGrabber.Disconnect(false);
    }

    // 配置相机
    private void button3_Click(object sender, EventArgs e)
    {
        myAcqFifo.OwnedExposureParams.Exposure = Convert.ToDouble(textBox1.Text);
        // 设置亮度参数
        myAcqFifo.OwnedBrightnessParams.Brightness = Convert.ToDouble(textBox2.Text);

        // 设置对比度
        // myAcqFifo.OwnedContrastParams.Contrast = 0;


    }
}


制作不易,地主老爷们赏点吧!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_Csharp

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值