【机械视觉】C#+VisionPro联合编程———【三、加载CogToolBlock工具详解,以及实例】
在VisionPro中,CogToolBlock 是一种容器工具,可以将多个视觉工具(如CogBlob、CogPMAlign等)组合成一个可复用的流程。通过C#与VisionPro联合编程,可以动态加载、配置和执行这些工具链。
加载CogToolBlockTool 工具
核心步骤:
步骤 1:创建ToolBlock实例
// 创建CogToolBlock实例
CogToolBlock toolBlock = new CogToolBlock();
步骤 2:加载ToolBlock文件
VisionPro的ToolBlock通常保存为.vpp文件(通过QuickBuild导出)或.toolblock文件。
string toolBlockPath = @"C:\VisionPro\MyToolBlock.vpp";
try
{
toolBlock = CogSerializer.LoadObjectFromFile(toolBlockPath) as CogToolBlock;
}
catch (Exception ex)
{
MessageBox.Show("加载ToolBlock失败: " + ex.Message);
return;
}
步骤 3:设置输入参数
通过Inputs属性设置ToolBlock的输入参数(例如图像、阈值等):
// 假设ToolBlock有一个名为"InputImage"的输入
ICogImage inputImage = CogImageConverter.ToCogImage(bitmap); // 将Bitmap转换为VisionPro图像
toolBlock.Inputs["InputImage"].Value = inputImage;
// 设置其他参数(如阈值)
toolBlock.Inputs["Threshold"].Value = 128;
步骤 4:执行ToolBlock
// 执行ToolBlock
toolBlock.Run();
// 检查执行状态
if (toolBlock.RunStatus.Result != CogToolResultConstants.Accept)
{
MessageBox.Show("ToolBlock执行失败: " + toolBlock.RunStatus.Message);
return;
}
步骤 5:获取输出结果
通过Outputs属性获取输出参数:
// 获取输出结果(例如检测到的坐标)
double x = (double)toolBlock.Outputs["OutputX"].Value;
double y = (double)toolBlock.Outputs["OutputY"].Value;
// 获取检测结果图像
CogImage8Grey resultImage = toolBlock.Outputs["ResultImage"].Value as CogImage8Grey;
步骤6:保存工具
CogSerializer.SaveObjectToFile(toolBlock,path); // 保存
完整示例代码
using Cognex.VisionPro;
using Cognex.VisionPro.ToolBlock;
public void RunToolBlockExample()
{
// 1. 加载ToolBlock
CogToolBlock toolBlock = null;
string toolBlockPath = @"C:\VisionPro\MyToolBlock.vpp";
try
{
toolBlock = CogSerializer.LoadObjectFromFile(toolBlockPath) as CogToolBlock;
}
catch (Exception ex)
{
MessageBox.Show("加载ToolBlock失败: " + ex.Message);
return;
}
// 2. 设置输入参数
Bitmap sourceBitmap = new Bitmap(@"C:\Images\test.bmp");
ICogImage inputImage = CogImageConverter.ToCogImage(sourceBitmap);
toolBlock.Inputs["InputImage"].Value = inputImage;
toolBlock.Inputs["Threshold"].Value = 128;
// 3. 执行ToolBlock
toolBlock.Run();
// 4. 处理结果
if (toolBlock.RunStatus.Result == CogToolResultConstants.Accept)
{
double x = (double)toolBlock.Outputs["OutputX"].Value;
double y = (double)toolBlock.Outputs["OutputY"].Value;
CogImage8Grey resultImage = toolBlock.Outputs["ResultImage"].Value as CogImage8Grey;
MessageBox.Show($"检测到坐标: ({x}, {y})");
}
else
{
MessageBox.Show("检测失败: " + toolBlock.RunStatus.Message);
}
// 5. 释放资源
toolBlock.Dispose();\
CogSerializer.SaveObjectToFile(toolBlock,path); 保存
}
关键注意事项
输入输出参数名称
- 必须与ToolBlock中定义的名称完全一致(区分大小写),否则会抛出异常。
ToolBlock激活状态
- 确保ToolBlock在QuickBuild中已正确激活(通过右键菜单激活工具)。
异常处理
- 使用try-catch捕获文件加载、参数设置等异常。
- 检查RunStatus.Result判断工具执行是否成功。
资源释放
- VisionPro对象(如CogImage、CogToolBlock)需要显式释放内存:
-
toolBlock.Dispose();
常见问题
加载ToolBlock时报错 "文件格式不支持"
- 确保文件是通过QuickBuild导出的合法ToolBlock文件。
输入参数类型不匹配
- 检查ToolBlock中参数的数据类型(如int vs double)。
执行速度慢
- 优化ToolBlock内部工具的参数(如降低PMAlign的精度要求)。
加载CogToolBlockTool工具详解实例
实例效果:
在窗体加载时创建tb变量并且加载CogToolBlock给变量赋值,当点击打开图片时,根据设定好的路径打开图片并展示在cogRecordDisplay1上,点击更改图片时更改tb变量中的输入图片,点击测量时测量出图片结果并且展示。在窗体跳转时将CogToolBlock的变量传输到窗体2中并且展示在cogToolBlockEditV21上。
一、设置visionPro工具
二、编写form1窗体事件(以下是源码)
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
ICogImage image = null; // tb块的图片
CogToolBlock tb = null;
/// <summary>
/// 打开图片
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
image = cogRecordDisplay1.Image = ReadImage2();
cogRecordDisplay1.Fit();
}
/// <summary>
/// 读取图片的方式1
/// </summary>
/// <returns></returns>
public ICogImage ReadImage1()
{
string path = @"C:\Program Files\Cognex\VisionPro\Images\nutsandbolts.bmp";
CogImageFileTool fileTool = new CogImageFileTool();
fileTool.Operator.Open(path,CogImageFileModeConstants.Read); // 读取图片
fileTool.Run();
return fileTool.OutputImage;
}
/// <summary>
/// 读取图片的方式2
/// </summary>
/// <returns></returns>
public ICogImage ReadImage2()
{
string path = @"C:\Program Files\Cognex\VisionPro\Images\nutsandbolts.bmp";
Bitmap map = new Bitmap(path);
ICogImage img = new CogImage8Grey(map); // 8 位的灰色
// ICogImage img = new CogImage24PlanarColor(map); // 24位的位深图
return img;
}
/// <summary>
/// 更改图片
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button3_Click(object sender, EventArgs e)
{
tb.Inputs["OutputImage"].Value = image;
}
/// <summary>
/// 跳转Form
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button4_Click(object sender, EventArgs e)
{
Form2 f2 = new Form2(tb);
f2.ShowDialog();
}
/// <summary>
/// 测量
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button5_Click(object sender, EventArgs e)
{
if (tb != null)
{
// 把采集到的图像传输更改图片
// tb.Ibputs 块的输入数据
// ["OutputImage"] 块添加的图片
// tb.Inputs["OutputImage"].Value = image;
tb.Run();
// 显示测量结果
cogRecordDisplay1.Record = tb.CreateLastRunRecord().SubRecords[0]; // 把测量之后的记录赋值给控件cogRecordDisplay1的record
cogRecordDisplay1.Fit();
int count = (int)tb.Outputs["Count"].Value;
label1.Text = "显示斑点个数为:" + count;
}
}
/// <summary>
/// 加载TB块
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form1_Load(object sender, EventArgs e)
{
string path = Directory.GetCurrentDirectory() + @"\blob.vpp";
tb = (CogToolBlock)CogSerializer.LoadObjectFromFile(path);
}
}
三、创建form2窗体并且设置cogToolBlockEditV21控件
四、编写form2窗体事件
public partial class Form2 : Form
{
CogToolBlock tb;
public Form2(CogToolBlock t)
{
InitializeComponent();
tb = t;
}
/// <summary>
/// 加载
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form2_Load(object sender, EventArgs e)
{
// 把传递过来的toolblock进行展示
cogToolBlockEditV21.Subject = tb;
}
}