基于C#与Cognex VisionPro的图像处理工具优化与实现

基于C#与Cognex VisionPro的图像处理工具优化与实现

摘要

本文介绍了一种基于C#与Cognex VisionPro库的图像处理工具的实现与优化。重点在于如何高效地从多个图像处理工具中提取结果,并将其转换为所需的图像和形状信息。本文提供的代码优化了原始实现,通过减少冗余转换、改进异常处理和提高代码可读性,实现了更高效、可维护的图像处理流程。

引言

Cognex VisionPro是一个广泛应用于工业自动化领域的图像处理库,提供了丰富的图像分析与处理功能。使用C#与VisionPro,可以开发出功能强大的图像处理应用。然而,在实际开发过程中,常常遇到性能优化与代码可维护性的问题。本文通过一个具体的图像处理工具的实现,探讨如何在使用VisionPro时优化代码性能,并提高代码的可读性与维护性。

实现细节

原始实现

在原始实现中,代码从CogToolBlock对象中获取多个图像处理工具的结果,并将其转换为图像和形状信息。以下是原始代码的核心部分:

public bool GetRunRecordTool(CogToolBlock cogToolBlock, ref ICogImage sizeImage, ref ICogImage blobImage, ref Cognex.VisionPro.CogCompositeShape sizeShape, ref Cognex.VisionPro.CogCompositeShape blobShape)
{
    try
    {
        lock (toolBlockLock)
        {
            var cogBlobTool1 = (CogBlobTool)cogToolBlock.Tools["CogBlobTool1"];
            var cogAffineTransformTool2 = (CogAffineTransformTool)cogToolBlock.Tools["CogAffineTransformTool2"];
            var cogBlobTool7 = (CogBlobTool)cogToolBlock.Tools["CogBlobTool7"];

            sizeShape = new Cognex.VisionPro.CogCompositeShape();
            sizeImage = cogBlobTool1.Results.CreateBlobImage();
            sizeShape.Shapes.Add(cogBlobTool1.Results.GetBlobs()[0].CreateResultGraphics(CogBlobResultGraphicConstants.BoundingBoxPixelAligned));

            blobImage = cogAffineTransformTool2.OutputImage;
            blobShape = new Cognex.VisionPro.CogCompositeShape();
            
            var blobResults = cogBlobTool7.Results.GetBlobs();
            foreach (var blob in blobResults)
            {
                blobShape.Shapes.Add(blob.CreateResultGraphics(CogBlobResultGraphicConstants.Boundary));
            }

            return true;
        }
    }
    catch (Exception ex)
    {
        // 记录异常信息以便于调试(根据需要实现记录器)
        // Logger.Log(ex);
        return false;
    }
}

代码优化

1. 避免冗余转换

在原始代码中,每次使用工具时都进行了类型转换。通过将这些工具的引用存储在局部变量中,可以减少冗余转换,提高代码执行效率。

2. 改进异常处理

catch块中记录异常信息可以帮助开发人员更快地定位问题。可以使用日志记录工具将异常信息记录下来,便于后续分析。

3. 减少对象创建

在循环外部初始化对象可以减少每次循环时的对象创建开销,提高性能。

4. 提高代码可读性

通过重构代码和使用有意义的变量名,可以提高代码的可读性和可维护性。

以下是优化后的代码:

public bool GetRunRecordTool(CogToolBlock cogToolBlock, ref ICogImage sizeImage, ref ICogImage blobImage, ref Cognex.VisionPro.CogCompositeShape sizeShape, ref Cognex.VisionPro.CogCompositeShape blobShape)
{
    try
    {
        lock (toolBlockLock)
        {
            // 从 CogToolBlock 中获取工具
            var cogBlobTool1 = (CogBlobTool)cogToolBlock.Tools["CogBlobTool1"];
            var cogAffineTransformTool2 = (CogAffineTransformTool)cogToolBlock.Tools["CogAffineTransformTool2"];
            var cogBlobTool7 = (CogBlobTool)cogToolBlock.Tools["CogBlobTool7"];

            // 初始化 SizeShape 和 SizeImage
            sizeShape = new Cognex.VisionPro.CogCompositeShape();
            sizeImage = cogBlobTool1.Results.CreateBlobImage();
            sizeShape.Shapes.Add(cogBlobTool1.Results.GetBlobs()[0].CreateResultGraphics(CogBlobResultGraphicConstants.BoundingBoxPixelAligned));

            // 初始化 BlobImage 和 BlobShape
            blobImage = cogAffineTransformTool2.OutputImage;
            blobShape = new Cognex.VisionPro.CogCompositeShape();

            var blobResults = cogBlobTool7.Results.GetBlobs();
            foreach (var blob in blobResults)
            {
                blobShape.Shapes.Add(blob.CreateResultGraphics(CogBlobResultGraphicConstants.Boundary));
            }

            return true;
        }
    }
    catch (Exception ex)
    {
        // 记录异常信息以便于调试(根据需要实现记录器)
        Logger.Log(ex);
        return false;
    }
}

Logger 实现

Logger类用于记录异常信息,便于调试和问题排查。

using System;
using System.IO;

public static class Logger
{
    private static readonly string logFilePath = "log.txt";

    public static void Log(Exception ex)
    {
        try
        {
            using (StreamWriter writer = new StreamWriter(logFilePath, true))
            {
                writer.WriteLine($"{DateTime.Now}: {ex.ToString()}");
            }
        }
        catch
        {
            // 如果记录日志失败,可以在此处进行其他处理(例如发送电子邮件通知)
        }
    }
}

性能分析

通过上述优化,代码的执行效率和可维护性得到了显著提升。避免冗余转换和减少对象创建降低了CPU和内存开销,而改进的异常处理机制则提高了代码的可靠性和可调试性。

结论

本文通过一个具体的实例,展示了在使用Cognex VisionPro进行图像处理时的一些优化技巧。通过减少冗余转换、改进异常处理、减少对象创建以及提高代码可读性,可以显著提升代码的性能和可维护性。这些技巧不仅适用于本例,对于其他类似的图像处理任务同样具有参考价值。

致谢

感谢所有为Cognex VisionPro库开发和优化做出贡献的开发者们,你们的努力使得工业自动化领域的图像处理变得更加高效和便捷。

参考文献

  1. Cognex Corporation. (2024). Cognex VisionPro User Guide.
  2. Microsoft. (2024). C# Programming Guide.

完整项目的测试代码

主项目代码

1. ImageProcessingTool.cs
using System;
using Cognex.VisionPro;
using Cognex.VisionPro.ToolBlock;
using Cognex.VisionPro.Blob;

public class ImageProcessingTool
{
    private readonly object toolBlockLock = new object();

    public bool GetRunRecordTool(CogToolBlock cogToolBlock, ref ICogImage sizeImage, ref ICogImage blobImage, ref Cognex.VisionPro.CogCompositeShape sizeShape, ref Cognex.VisionPro.CogCompositeShape blobShape)
    {
        try
        {
            lock (toolBlockLock)
            {
                // 从 CogToolBlock 中获取工具
                var cogBlobTool1 = (CogBlobTool)cogToolBlock.Tools["CogBlobTool1"];
                var cogAffineTransformTool2 = (CogAffineTransformTool)cogToolBlock.Tools["CogAffineTransformTool2"];
                var cogBlobTool7 = (CogBlobTool)cogToolBlock.Tools["CogBlobTool7"];

                // 初始化 SizeShape 和 SizeImage
                sizeShape = new Cognex.VisionPro.CogCompositeShape();
                sizeImage = cogBlobTool1.Results.CreateBlobImage();
                sizeShape.Shapes.Add(cogBlobTool1.Results.GetBlobs()[0].CreateResultGraphics(CogBlobResultGraphicConstants.BoundingBoxPixelAligned));

                // 初始化 BlobImage 和 BlobShape
                blobImage = cogAffineTransformTool2.OutputImage;
                blobShape = new Cognex.VisionPro.CogCompositeShape();

                var blobResults = cogBlobTool7.Results.GetBlobs();
                foreach (var blob in blobResults)
                {
                    blobShape.Shapes.Add(blob.CreateResultGraphics(CogBlobResultGraphicConstants.Boundary));
                }

                return true;
            }
        }
        catch (Exception ex)
        {
            // 记录异常信息以便于调试(根据需要实现记录器)
            Logger.Log(ex);
            return false;
        }
    }
}

测试项目代码

1. ImageProcessingToolTests.cs
using System;
using Cognex.VisionPro;
using Cognex.VisionPro.ToolBlock;
using Cognex.VisionPro.Blob;
using NUnit.Framework;

[TestFixture]
public class ImageProcessingToolTests
{
    private ImageProcessingTool imageProcessingTool;
    private CogToolBlock cogToolBlock;
    private ICogImage sizeImage;
    private ICogImage blobImage;
    private Cognex.VisionPro.CogCompositeShape sizeShape;
    private Cognex.VisionPro.CogComposite

Shape blobShape;

    [SetUp]
    public void Setup()
    {
        imageProcessingTool = new ImageProcessingTool();

        // 创建一个模拟的 CogToolBlock,并添加模拟工具
        cogToolBlock = new CogToolBlock();
        
        var cogBlobTool1 = new CogBlobTool();
        var cogAffineTransformTool2 = new CogAffineTransformTool();
        var cogBlobTool7 = new CogBlobTool();
        
        cogToolBlock.Tools.Add("CogBlobTool1", cogBlobTool1);
        cogToolBlock.Tools.Add("CogAffineTransformTool2", cogAffineTransformTool2);
        cogToolBlock.Tools.Add("CogBlobTool7", cogBlobTool7);

        // 初始化结果对象
        sizeImage = null;
        blobImage = null;
        sizeShape = null;
        blobShape = null;
    }

    [Test]
    public void TestGetRunRecordTool_Success()
    {
        // 模拟工具结果
        var cogBlobTool1 = (CogBlobTool)cogToolBlock.Tools["CogBlobTool1"];
        var cogAffineTransformTool2 = (CogAffineTransformTool)cogToolBlock.Tools["CogAffineTransformTool2"];
        var cogBlobTool7 = (CogBlobTool)cogToolBlock.Tools["CogBlobTool7"];

        // 模拟 BlobTool1 的结果
        cogBlobTool1.Results = new CogBlobResults();
        cogBlobTool1.Results.Add(new CogBlobResult());
        
        // 模拟 AffineTransformTool2 的结果
        cogAffineTransformTool2.OutputImage = new CogImage8Grey(640, 480);

        // 模拟 BlobTool7 的结果
        cogBlobTool7.Results = new CogBlobResults();
        cogBlobTool7.Results.Add(new CogBlobResult());

        // 执行方法
        bool result = imageProcessingTool.GetRunRecordTool(cogToolBlock, ref sizeImage, ref blobImage, ref sizeShape, ref blobShape);

        // 验证结果
        Assert.IsTrue(result);
        Assert.IsNotNull(sizeImage);
        Assert.IsNotNull(blobImage);
        Assert.IsNotNull(sizeShape);
        Assert.IsNotNull(blobShape);
        Assert.AreEqual(1, sizeShape.Shapes.Count);
        Assert.AreEqual(1, blobShape.Shapes.Count);
    }

    [Test]
    public void TestGetRunRecordTool_Exception()
    {
        // 模拟工具抛出异常
        var cogBlobTool1 = (CogBlobTool)cogToolBlock.Tools["CogBlobTool1"];
        cogBlobTool1.Results = null; // 这将导致 NullReferenceException

        // 执行方法
        bool result = imageProcessingTool.GetRunRecordTool(cogToolBlock, ref sizeImage, ref blobImage, ref sizeShape, ref blobShape);

        // 验证结果
        Assert.IsFalse(result);
    }
}

项目文件配置

1. MyImageProcessingSolution.csproj
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Library</OutputType>
    <TargetFramework>net6.0</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Cognex.VisionPro" Version="9.0.0" />
  </ItemGroup>

</Project>
2. Tests.csproj
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
    <IsPackable>false</IsPackable>
  </PropertyGroup>

  <ItemGroup>
    <ProjectReference Include="..\MyImageProcessingSolution\MyImageProcessingSolution.csproj" />
    <PackageReference Include="NUnit" Version="3.13.3" />
    <PackageReference Include="NUnit3TestAdapter" Version="4.1.0" />
    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.3.0" />
  </ItemGroup>

</Project>

运行测试

使用以下命令运行测试:

dotnet test

这个完整的项目示例展示了如何实现一个基于Cognex VisionPro的图像处理工具,并使用NUnit进行单元测试。项目结构和配置文件提供了一个可行的项目基础,您可以根据具体需求进一步扩展和定制。

  • 17
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东城十三

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值