在工業視覺檢測與自動化領域,康耐視(Cognex)的 VisionPro 是一款功能強大的視覺開發工具,而 C# 憑藉其簡潔性與高效性,成為許多開發者的首選編程語言。本文將詳細介紹如何通過 C# 與 VisionPro 聯合編程實現相機連接,為後續的視覺檢測應用開發奠定基礎。

一、環境準備

1.1 安裝 VisionPro

首先確保已安裝康耐視 VisionPro 軟件。安裝過程中,注意勾選相關的開發工具包(如 Cognex.VisionPro.ToolBlock 等),這些工具包將為後續編程提供關鍵支持。

1.1 創建vpp項目連接相機

搜索Cognex Gige

詳細介紹:VisionPro 與 C# 聯合編程:相機連接實戰指南_Text

更改本機和相機ip配置

詳細介紹:VisionPro 與 C# 聯合編程:相機連接實戰指南_System_02

修改子網掩碼為255.255.255.0

詳細介紹:VisionPro 與 C# 聯合編程:相機連接實戰指南_Text_03

配置驅動程序

詳細介紹:VisionPro 與 C# 聯合編程:相機連接實戰指南_System_04

詳細介紹:VisionPro 與 C# 聯合編程:相機連接實戰指南_Text_05

詳細介紹:VisionPro 與 C# 聯合編程:相機連接實戰指南_Text_06

更新驅動(如果能夠選擇9014Bytes,跳過此步驟)

詳細介紹:VisionPro 與 C# 聯合編程:相機連接實戰指南_System_07

詳細介紹:VisionPro 與 C# 聯合編程:相機連接實戰指南_System_08

更新更改

詳細介紹:VisionPro 與 C# 聯合編程:相機連接實戰指南_Text_09

相機ip配置:注意Host  IP 和IP address 第四位不能相同

詳細介紹:VisionPro 與 C# 聯合編程:相機連接實戰指南_System_10

打開visionPro

選擇照相機,生成vpp文件並保存

詳細介紹:VisionPro 與 C# 聯合編程:相機連接實戰指南_加載_11

1.3新建 C# 項目

打開 Visual Studio,創建一個新的 Windows 桌面應用程序(.NET Framework) 項目(也可根據需求選擇其他類型,如 WPF,但本文以 WinForms 為例)。打開項目工具箱

詳細介紹:VisionPro 與 C# 聯合編程:相機連接實戰指南_加載_12

然後打開VisionPro的ReferencedAssemblies文件夾

詳細介紹:VisionPro 與 C# 聯合編程:相機連接實戰指南_Text_13

Ctrl+A全選,並將其直接拖入vp選項卡下

搜索cogAcqFifoEdit,將其加入From1窗體

詳細介紹:VisionPro 與 C# 聯合編程:相機連接實戰指南_System_14

同理,並加入三個按鈕

詳細介紹:VisionPro 與 C# 聯合編程:相機連接實戰指南_System_15

 右鍵單擊項目點擊屬性

詳細介紹:VisionPro 與 C# 聯合編程:相機連接實戰指南_加載_16

選擇x64

詳細介紹:VisionPro 與 C# 聯合編程:相機連接實戰指南_System_17

點擊重新生成解決方案

詳細介紹:VisionPro 與 C# 聯合編程:相機連接實戰指南_加載_18

二、代碼部分

接下來詳細解析代碼中各個方法的實現及其作用:

引入Cognex頭文件

using Cognex.VisionPro;
using Cognex.VisionPro.ImageFile;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

加載相機配置

private void Form1_Load(object sender, EventArgs e)
{
    // 加載相機配置
    string path = @"C:\Users\15783\Desktop\VisionPro\連接相機\連接相機\bin\相機連接.vpp";
    // 必須要保證vpp中有CogAcqFifoTool才可以
    cogAcqFifoTool = CogSerializer.LoadObjectFromFile(path) as CogAcqFifoTool;
    cogAcqFifoEditV21.Subject = cogAcqFifoTool;
}

在窗體加載時,此方法從指定路徑加載 VisionPro 的配置文件(.vpp)。通過 CogSerializer.LoadObjectFromFile 方法將文件內容加載並轉換為 CogAcqFifoTool 對象。確保 .vpp 文件中包含 CogAcqFifoTool,否則轉換會失敗。最後將加載的 cogAcqFifoTool 設置為 cogAcqFifoEditV21 控件的 Subject,以便通過該控件對相機採集工具進行配置和監控。

執行拍照操作
private void button1_Click(object sender, EventArgs e)
{
    // 拍照
    if (cogAcqFifoTool == null)
    {
        cogAcqFifoTool = new CogAcqFifoTool();
    }
    if (cogAcqFifoTool.Operator == null)
    {
        MessageBox.Show("相機連接有問題");
        return;
    }
    cogAcqFifoTool.Run();
    cogDisplay1.Image = cogAcqFifoTool.OutputImage;
    cogDisplay1.Fit();
}

當點擊拍照按鈕時,首先檢查 cogAcqFifoTool 是否為空,若為空則創建一個新的 CogAcqFifoTool 實例。接着驗證 cogAcqFifoTool.Operator 是否存在,若不存在則彈出提示 “相機連接有問題” 並返回。若連接正常,調用 cogAcqFifoTool.Run() 執行拍照。拍照完成後,將獲取的圖像 cogAcqFifoTool.OutputImage 顯示在 cogDisplay1 控件上,並通過 cogDisplay1.Fit() 方法讓圖像適配顯示區域。

釋放相機資源
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    // 獲取當前的所有相機資源
    CogFrameGrabbers cogFrame = new CogFrameGrabbers();
    foreach (ICogFrameGrabber item in cogFrame)
    {
        item.Disconnect(false);
    }
}

在窗體關閉時,此方法用於釋放所有與相機相關的資源。首先創建 CogFrameGrabbers 對象來獲取當前所有的相機幀採集器,然後通過循環遍歷每個 ICogFrameGrabber 項,調用 Disconnect 方法斷開與相機的連接,參數 false 表示在斷開連接時不等待正在進行的操作完成。

切換實時顯示
private void button2_Click(object sender, EventArgs e)
{
    if (button2.Text == "實時顯示")
    {
        button2.Text = "停止實時顯示";
        cogDisplay1.StartLiveDisplay(cogAcqFifoTool.Operator, false);
    }
    else
    {
        button2.Text = "實時顯示";
        cogDisplay1.StopLiveDisplay();
    }
}

該方法實現了實時顯示的切換功能。當按鈕文本為 “實時顯示” 時,點擊按鈕將文本改為 “停止實時顯示”,並調用 cogDisplay1.StartLiveDisplay 方法啓動實時顯示,傳入 cogAcqFifoTool.Operator 作為相機操作對象,參數 false 表示不使用緩存。反之,當按鈕文本為 “停止實時顯示” 時,點擊按鈕將文本改回 “實時顯示”,並調用 cogDisplay1.StopLiveDisplay 方法停止實時顯示。

存儲拍攝的圖片
private void button3_Click(object sender, EventArgs e)
{
    // 存儲圖片
    string path = Directory.GetCurrentDirectory() + @"\ImageDir";
    if (!Directory.Exists(path))
    {
        Directory.CreateDirectory(path);
    }
    // 定義文件路徑
    string imageName = $"{DateTime.Now.ToString("HHmmss")}.bmp";
    // 保存圖片
    ICogImage image = cogAcqFifoTool.OutputImage;
    // 文件存儲工具(讀寫)
    CogImageFileTool fileTool = new CogImageFileTool();
    fileTool.InputImage = image;
    fileTool.Operator.Open($"{path}\\{imageName}", CogImageFileModeConstants.Write);
    fileTool.Run();
}

點擊存儲圖片按鈕時,首先確定存儲目錄 path,通過 Directory.GetCurrentDirectory() 獲取當前應用程序目錄並拼接上 \ImageDir 作為存儲路徑。檢查該目錄是否存在,若不存在則使用 Directory.CreateDirectory(path) 創建目錄。然後生成文件名 imageName,以當前時間(格式為 HHmmss)命名並加上 .bmp 後綴。接着獲取當前拍攝的圖像 cogAcqFifoTool.OutputImage,創建 CogImageFileTool 對象 fileTool,將獲取的圖像設置為 fileTool 的 InputImage。再通過 fileTool.Operator.Open 方法打開指定路徑和文件名的文件,設置為寫入模式(CogImageFileModeConstants.Write),最後調用 fileTool.Run() 執行存儲操作,將圖像保存到指定位置。

通過以上代碼,實現了相機配置加載、拍照、實時顯示控制以及圖片存儲等功能,為基於 VisionPro 和 C# 的工業視覺應用開發提供了基礎的相機操作支持。在實際應用中,還可以根據需求進一步擴展和優化,例如添加更豐富的相機參數設置界面、完善圖像預處理邏輯或實現與其他業務系統的數據交互等。

完整代碼

using Cognex.VisionPro;

using Cognex.VisionPro.ImageFile;

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.IO;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows.Forms;namespace 連接相機

{    public partial class Form1 : Form

    {

        CogAcqFifoTool cogAcqFifoTool = null;

        public Form1()

        {

            InitializeComponent();

        }        private void Form1_Load(object sender, EventArgs e)

        {

            //加載相機配置

            string path = @"C:\Users\15783\Desktop\VisionPro\連接相機\連接相機\bin\相機連接.vpp";

            //必須要保證vpp中有CogAcqFifoTool才可以

            cogAcqFifoTool = CogSerializer.LoadObjectFromFile(path) as CogAcqFifoTool;

            cogAcqFifoEditV21.Subject = cogAcqFifoTool;

        }        private void button1_Click(object sender, EventArgs e)

        {

            //拍照

            if (cogAcqFifoTool == null)

            {

                cogAcqFifoTool = new CogAcqFifoTool();

            }

            if(cogAcqFifoTool.Operator== null)

            {

                MessageBox.Show("相機連接有問題");

                return;

            }

            cogAcqFifoTool.Run();

            cogDisplay1.Image = cogAcqFifoTool.OutputImage;

            cogDisplay1.Fit();

        }        private void Form1_FormClosing(object sender, FormClosingEventArgs e)

        {

            //獲取當前的所有相機資源

            CogFrameGrabbers cogFrame = new CogFrameGrabbers();

            foreach(ICogFrameGrabber item in cogFrame)

            {

                item.Disconnect(false);

            }

        }        private void button2_Click(object sender, EventArgs e)

        {

            if (button2.Text == "實時顯示")

            {

                button2.Text = "停止實時顯示";

                cogDisplay1.StartLiveDisplay(cogAcqFifoTool.Operator,false);            }

            else

            {

                button2.Text = "實時顯示";

                cogDisplay1.StopLiveDisplay();

            }

        }        private void button3_Click(object sender, EventArgs e)

        {

            //存儲圖片

            string path = Directory.GetCurrentDirectory() + @"\ImageDir";

            if (!Directory.Exists(path))

            {

                Directory.CreateDirectory(path);

            }

            //定義文件路徑

            string imageName = $"{DateTime.Now.ToString("HHmmss")}.bmp";

            //保存圖片

            ICogImage image =cogAcqFifoTool.OutputImage;

            //文件存儲工具(讀寫)

            CogImageFileTool fileTool = new CogImageFileTool();

            fileTool.InputImage = image;

            fileTool.Operator.Open($"{path}\\{imageName}", CogImageFileModeConstants.Write);

            fileTool.Run();

        }

    }

}