在工業視覺檢測與自動化領域,康耐視(Cognex)的 VisionPro 是一款功能強大的視覺開發工具,而 C# 憑藉其簡潔性與高效性,成為許多開發者的首選編程語言。本文將詳細介紹如何通過 C# 與 VisionPro 聯合編程實現相機連接,為後續的視覺檢測應用開發奠定基礎。
一、環境準備
1.1 安裝 VisionPro
首先確保已安裝康耐視 VisionPro 軟件。安裝過程中,注意勾選相關的開發工具包(如 Cognex.VisionPro.ToolBlock 等),這些工具包將為後續編程提供關鍵支持。
1.1 創建vpp項目連接相機
搜索Cognex Gige
更改本機和相機ip配置
修改子網掩碼為255.255.255.0
配置驅動程序
更新驅動(如果能夠選擇9014Bytes,跳過此步驟)
更新更改
相機ip配置:注意Host IP 和IP address 第四位不能相同
打開visionPro
選擇照相機,生成vpp文件並保存
1.3新建 C# 項目
打開 Visual Studio,創建一個新的 Windows 桌面應用程序(.NET Framework) 項目(也可根據需求選擇其他類型,如 WPF,但本文以 WinForms 為例)。打開項目工具箱
然後打開VisionPro的ReferencedAssemblies文件夾
Ctrl+A全選,並將其直接拖入vp選項卡下
搜索cogAcqFifoEdit,將其加入From1窗體
同理,並加入三個按鈕
右鍵單擊項目點擊屬性
選擇x64
點擊重新生成解決方案
二、代碼部分
接下來詳細解析代碼中各個方法的實現及其作用:
引入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();
}
}
}