视觉定位 完整软件。 开发语言:C# + Halcon。 1.流程可配置; 2.海康威视相机采图,可定制成其它品牌相机(Basler,映美精 等); 3.模板匹配; 4.定位指针,拟合圆,拟合矩形;跟随模板匹配跑; 5.实时播放;输出结果对列; 6.代码结构使用共同接口,方便工具扩展。

在视觉定位领域,打造一款功能全面且灵活的软件至关重要。今天就来聊聊基于C# + Halcon开发的这样一款视觉定位完整软件,它具备一系列实用且强大的特性。

一、流程可配置

流程可配置意味着软件能适应不同的视觉定位需求场景。在代码层面,我们可以通过配置文件来实现这一点。比如使用XML配置文件,在C#中可以这样读取配置:

using System.Xml;

public class ConfigReader
{
    public static string GetConfigValue(string key)
    {
        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.Load("config.xml");
        XmlNodeList nodeList = xmlDoc.SelectNodes("/configuration/settings/setting");
        foreach (XmlNode node in nodeList)
        {
            if (node.Attributes["key"].Value == key)
            {
                return node.Attributes["value"].Value;
            }
        }
        return null;
    }
}

在上述代码中,我们定义了一个ConfigReader类,GetConfigValue方法用于从config.xml文件中根据传入的key获取对应的value。例如,我们可以在配置文件中定义模板匹配的参数、相机的参数等,通过这种方式灵活配置视觉定位流程。

二、相机适配

软件支持海康威视相机采图,并且可定制成其它品牌相机,如Basler、映美精等。以海康威视相机为例,在C#中结合其SDK进行采图:

// 引入海康威视相机SDK相关命名空间
using HikVisionSdk; 

public class HikCamera
{
    private CameraHandle cameraHandle;

    public HikCamera()
    {
        // 初始化相机
        cameraHandle = Camera.Init(); 
    }

    public Image GetImage()
    {
        return Camera.GrabImage(cameraHandle);
    }

    public void Dispose()
    {
        Camera.Release(cameraHandle);
    }
}

对于其它品牌相机,我们可以通过实现相同的接口来达到统一调用的目的。例如定义一个ICamera接口:

public interface ICamera
{
    Image GetImage();
    void Dispose();
}

然后针对不同品牌相机实现这个接口,这样在切换相机品牌时,只需要在实例化相机对象的地方进行修改,代码结构清晰且易于维护。

三、模板匹配

模板匹配是视觉定位中的重要环节。在Halcon中,实现模板匹配的代码如下:

read_image (Image, 'template.png')
create_template (Image, TemplateID)
read_image (SearchImage,'search.png')
find_template (SearchImage, TemplateID, 0.5, 1, 0.5, 'least_squares', 0, 0.7, Row, Column, Angle, Score)

上述Halcon代码,首先读取模板图像并创建模板,然后读取待搜索图像,通过find_template算子在搜索图像中查找模板,返回匹配的位置(行Row、列Column)、角度Angle以及匹配分数Score。在C#中调用Halcon实现模板匹配,可以这样做:

using HalconDotNet;

public class TemplateMatcher
{
    private HObject template;
    private HTemplateHandle templateID;

    public TemplateMatcher(string templatePath)
    {
        HOperatorSet.ReadImage(out template, templatePath);
        HOperatorSet.CreateTemplate(template, out templateID);
    }

    public void Match(HObject searchImage, out double row, out double column, out double angle, out double score)
    {
        HOperatorSet.FindTemplate(searchImage, templateID, 0.5, 1, 0.5, "least_squares", 0, 0.7, out row, out column, out angle, out score);
    }

    public void Dispose()
    {
        template.Dispose();
        templateID.Dispose();
    }
}

四、定位指针,拟合圆,拟合矩形

在模板匹配找到目标位置后,常常需要进一步对目标进行更精确的定位,比如拟合圆和拟合矩形。在Halcon中拟合圆的代码如下:

select_shape (Regions, SelectedRegions, 'circularity', 'and', 0.8, 1)
fit_circle_contour_xld (SelectedRegions, 'algebraic', -1, 0, 0, 3, 2, Row, Column, Radius, StartPhi, EndPhi, PointOrder)

这段代码先通过形状选择筛选出接近圆形的区域,然后对这些区域进行圆拟合,得到圆心坐标RowColumn以及半径Radius等参数。拟合矩形也有类似的算子,如fitrectangle2contour_xld。在C#中结合Halcon实现拟合圆:

public class CircleFitter
{
    public static void FitCircle(HObject regions, out double row, out double column, out double radius)
    {
        HObject selectedRegions;
        HOperatorSet.SelectShape(regions, out selectedRegions, "circularity", "and", 0.8, 1);
        HTuple rowTuple, columnTuple, radiusTuple, startPhiTuple, endPhiTuple, pointOrderTuple;
        HOperatorSet.FitCircleContourXld(selectedRegions, "algebraic", -1, 0, 0, 3, 2, out rowTuple, out columnTuple, out radiusTuple, out startPhiTuple, out endPhiTuple, out pointOrderTuple);
        row = rowTuple.D;
        column = columnTuple.D;
        radius = radiusTuple.D;
    }
}

五、实时播放与输出结果队列

实时播放图像可以通过在界面上实时更新图像控件来实现。在C#的WinForms应用程序中,可以这样做:

private void timer1_Tick(object sender, EventArgs e)
{
    HObject image = camera.GetImage();
    HWindowControl1.HalconWindow.DispObj(image);
}

这里timer1是一个定时器,定时获取相机图像并显示在HWindowControl1控件上。对于输出结果队列,我们可以使用Queue类来实现:

Queue<Result> resultQueue = new Queue<Result>();

public void AddResult(Result result)
{
    lock (resultQueue)
    {
        resultQueue.Enqueue(result);
    }
}

public Result GetResult()
{
    lock (resultQueue)
    {
        if (resultQueue.Count > 0)
        {
            return resultQueue.Dequeue();
        }
        return null;
    }
}

上述代码实现了一个简单的结果队列,AddResult方法用于将结果加入队列,GetResult方法用于从队列中取出结果,使用lock关键字确保线程安全。

六、代码结构使用共同接口,方便工具扩展

通过使用共同接口,我们的软件具备良好的扩展性。例如前面提到的ICamera接口,不仅方便相机品牌的切换,还为未来添加新的相机品牌提供了便利。同样,对于模板匹配、拟合等功能,也可以定义接口,如ITemplateMatcherIFitter等。

public interface ITemplateMatcher
{
    void Match(HObject searchImage, out double row, out double column, out double angle, out double score);
    void Dispose();
}

不同的模板匹配算法可以实现这个接口,在需要切换算法时,只需要修改实例化ITemplateMatcher对象的地方,而不需要大量修改其它代码。这样的代码结构使得软件在功能扩展时更加灵活高效。

视觉定位 完整软件。 开发语言:C# + Halcon。 1.流程可配置; 2.海康威视相机采图,可定制成其它品牌相机(Basler,映美精 等); 3.模板匹配; 4.定位指针,拟合圆,拟合矩形;跟随模板匹配跑; 5.实时播放;输出结果对列; 6.代码结构使用共同接口,方便工具扩展。

通过以上这些功能的实现,基于C# + Halcon开发的这款视觉定位完整软件在实际应用中能够满足多样化的视觉定位需求,无论是在工业检测、机器人视觉等领域都能发挥重要作用。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐