当前位置: 首页 > news >正文

【机械视觉】C#+VisionPro联合编程———【三、C#操作VisionPro中的工具详解(CogToolBlock ),以及实例】

【机械视觉】C#+VisionPro联合编程———【三、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);  // 保存 

加载其他工具

// 加载CogPMAlignTool
Pma = (CogPMAlignTool)CogSerializer.LoadObjectFromFile("./pma.vpp");
// 加载CogCompositeColorMatchTool
Col = (CogCompositeColorMatchTool)CogSerializer.LoadObjectFromFile("./col.vpp");


完整示例代码

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;
    }


    
}

相关文章:

  • Websocket的基本使用
  • SpringBoot整合Kafka
  • 【一句话经验】ubuntu vi/vim 模式自动设置为paste
  • 网络安全之tcpdump工具
  • Spring Boot3整合Knife4j(4.5.0)
  • 一、docker的安装
  • LVTTL(Low Voltage Transistor-Transistor Logic)电平详解
  • Torch 模型 model => .onnx => .trt 及利用 TensorTR 在 C++ 下的模型部署教程
  • opencv-显示图片
  • python连接数据库速查示例
  • 【python实战】-- 选择解压汇总mode进行数据汇总20250310更新
  • 探讨如何在AS上构建webrtc(3)分享WebRTC-CMakeBuild轻量化工程
  • C语言处理字符串的十个函数(附带大量实例)
  • 前端生成二维码 + 条形码
  • Python 异步编程入门:从零到上手 asyncio 协程(附实战案例)
  • Taro 面试题
  • 前端项目Axios封装Vue3详细教程(附源码)
  • 基于 Qwen2.5-14B + Elasticsearch RAG 的大数据知识库智能问答系统
  • 23种设计模式
  • 用物理信息神经网络(PINN)解决实际优化问题:全面解析与实践
  • seo网站运营/青岛网站制作seo
  • 做网站建设的平台/百度网址大全 官网
  • 魏县企业做网站推广/百度热搜榜排名今日第一
  • 做广告公司网站建设价格/景区营销案例100例
  • 中亿丰建设集团股份有限公司网站/国内优秀网页设计赏析
  • 聊城质量最好网站建设/seo 的原理和作用