C#+VisionPro获取相机并操作的方式
目录
第一步、在visionPro中使用cogacqfifotool工具检测详解并配置相机,然后将工具保存本地。
第三步、创建Load事件使用CogSerializer.LoadObjectFromFile()方式进行加载cogacqfifotool工具
第四步、创建实时显示按钮的click事件并实现预览效果(展示在cogRecordDisplay1控件上)
第七步、窗体关闭时释放相机(formclosing窗体关闭事件)
第二步、通过CogFrameGrabbers类进行抓取相机,并且进行操作加载
第五步、实现配置相机功能(双击配置参数按钮订阅click事件)
前言:
- 本文通过使用两个小例子介绍两种抓取相机的方式。
- 第一种抓取方式是通过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;
}
}
制作不易,地主老爷们赏点吧!!!