一、展示效果
这里有些功能没有太注重细节主要就是把按键功能实现
二、搭建页面
button textBox label CogRecordDisplay CogToolBlockEditV21
三、步骤
1.实例化类
public ICogFrameGrabber cogFrame;
public ICogAcqFifo fifo;
public CogToolBlock tb;
public ICogImage newImage;
2.窗体加载做准备(加载相机,判断相机数量)
private void Form1_Load(object sender, EventArgs e)
{
Inital();
LoadToolBlock();
}
private void Inital()
{
CogFrameGrabbers cogFrameGrabbers = new CogFrameGrabbers();
Console.WriteLine(cogFrameGrabbers.Count);
if(cogFrameGrabbers.Count<1)
{
MessageBox.Show("相机连接失败");
}
foreach(ICogFrameGrabber frame in cogFrameGrabbers)
{
//相机
cogFrame = frame;
//创建图像采集接口
//参数1: 图像类型
//参数2: 像素类型
fifo= frame.CreateAcqFifo("Generic GigEVision (Mono)", CogAcqFifoPixelFormatConstants.Format8Grey, 0, true);
}
//采集图像完成,回自动调用一个事件处理函数
//Complete 事件 类似于 click click鼠标左键单击的时候执行
//Complete 采集图像完成之后调用
//绑定一个事件处理函数
// public delegate void CogCompleteEventHandler(object sender, CogCompleteEventArgs e)
// mFifo.Complete += new CogCompleteEventHandler(mAcq_com) ;
//简化
fifo.Complete += mApp;
}
private void mApp(object sender, CogCompleteEventArgs e)
{
//显示采集到的图像
//mFifo.GetFifoState()方法用于获取FIFO的状态信息。具体来说,这个方法可以返回以下三个状态信息:
//numPendingVal:表示等待中的数据包数量。
//numReadyVal:表示已准备好的数据包数量。
//busyVal:表示FIFO当前是否忙碌
//这些信息可以帮助开发者了解FIFO的当前状态,从而进行相应的处理。例如,如果numReadyVal大于0,表示有数据包可供处理;如果numPendingVal大于0,表示有数据包正在等待处理;如果busyVal为true,表示FIFO当前正在忙碌中
int numPendingVal, numReadyVal;
bool busyVal;
try
{
//获取到采集的图像
fifo.GetFifoState(out numPendingVal, out numReadyVal, out busyVal);
CogAcqInfo info = new CogAcqInfo();
//CompleteAcquireEx() 结束图像采集过程,并返回采集到的图像数据
if (numReadyVal > 0)
{
ICogImage image = fifo.CompleteAcquireEx(info);
cogRecordDisplay1.Image = image;
cogRecordDisplay1.Fit();
newImage=image;
}
}
catch (Exception ex) { throw; }
}
public void LoadToolBlock()
{
string path=Directory.GetCurrentDirectory()+@"\ct.vpp";
tb=CogSerializer.LoadObjectFromFile(path)as CogToolBlock;
}
3.窗体关闭释放相机
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
Release();
}
public void Release()
{
//获取相机集合
CogFrameGrabbers cogFrame=new CogFrameGrabbers();
foreach(ICogFrameGrabber item in cogFrame)
{
//释放相机
item.Disconnect(false);
}
}
4.拍照功能
private void button1_Click(object sender, EventArgs e)
{
//调用拍照方式
fifo.StartAcquire();
}
5.设置曝光
private void button2_Click(object sender, EventArgs e)
{
//属性用于获取或设置相机的曝光参数
//OwnedExposureParams是mFifo的一个属性,用于访问相机的曝光参数。Exposure是OwnedExposureParams的一个成员,用于具体设置或获取曝光值。
fifo.OwnedExposureParams.Exposure = Convert.ToDouble(textBox1.Text);
}
6.保存图片
private void button3_Click(object sender, EventArgs e)
{
string path = Directory.GetCurrentDirectory() + @"\Image";
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
CogImageFileTool cogImage = new CogImageFileTool();
cogImage.InputImage = cogRecordDisplay1.Image;
string imagen = $"{DateTime.Now.ToString("yyyyMMddHHmmss")}.jpg";
cogImage.Operator.Open($"{path}\\{imagen}", CogImageFileModeConstants.Write);
cogImage.Run();
}
7.图像调取工具(两种)
//读取方式一:
public ICogImage ReadImage1()
{
string path = @"C:\Program Files\Cognex\VisionPro\Images\blister.tif";
//实例化工具
CogImageFileTool cogImageFileTool = new CogImageFileTool();
cogImageFileTool.Operator.Open(path, CogImageFileModeConstants.Read);
cogImageFileTool.Run();
return cogImageFileTool.OutputImage;
}
//读取方法二:
public ICogImage ReadImage2()
{
string path = @"C:\Program Files\Cognex\VisionPro\Images\blister.tif";
Bitmap bitmap = new Bitmap(path);
//CogImage8Grey
ICogImage image =new CogImage24PlanarColor(bitmap);
return image;
}
8.打开图像
private void button4_Click(object sender, EventArgs e)
{
cogRecordDisplay1.Image = ReadImage1();
}
9.手动选择图像
private void button5_Click(object sender, EventArgs e)
{
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter= "图像文件 (*.jpg;*.jpeg;*.png;*.bmp;*.gif)|*.jpg;*.jpeg;*.png;*.bmp;*.gif";
openFileDialog.InitialDirectory= @"C:\Program Files\Cognex\VisionPro\Images";
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
Bitmap tamp = new Bitmap(openFileDialog.FileName);
// //CogImage8Grey
ICogImage image = new CogImage24PlanarColor(tamp);
cogRecordDisplay1.Image = image;
}
}
10.加载TB
private void button6_Click(object sender, EventArgs e)
{
Form2 form2 = new Form2(tb);
form2.Show();
}
//加载tb
public void LoadToolBlock()
{
string path=Directory.GetCurrentDirectory()+@"\ct.vpp";
tb=CogSerializer.LoadObjectFromFile(path)as CogToolBlock;
}
11.测量并更新结果
private void button7_Click(object sender, EventArgs e)
{
//把新拍摄的图像传递到tb中
tb.Inputs["OutputImage"].Value = newImage;
tb.Run();
//获取测量之后的图像
//tb.CreateLastRunRecord().SubRecords[0];
//方法的作用是获取上一次调用工具块(ToolBlock)运行的结构记录
//ICogRecord
cogRecordDisplay1.Record = tb.CreateLastRunRecord().SubRecords[0];
cogRecordDisplay1.Fit();
double douwidth = (double)tb.Outputs["MyWidth"].Value;
label2.Text=douwidth.ToString();
}
12.Tool Block页面
CogToolBlock block=null;
public Form2(CogToolBlock TB)
{
InitializeComponent();
block = TB;
}
private void Form2_Load(object sender, EventArgs e)
{
cogToolBlockEditV21.Subject=block;
}