C#联合halcon 3D机器视觉框架 高度差 斜边角度 圆直径 粗糙度等 halcon开发的3D机器视觉框架,C#联合halcon开发 目前可测量高度差,斜边角度,圆直径,粗糙度等,C#联合halcon开发,通用3D视觉框架,机器视觉,工业视觉,3D视觉,提供源代码

最近在做一个3D机器视觉的项目,主要用C#联合Halcon开发一个通用的3D视觉框架。这个框架目前可以实现高度差测量、斜边角度计算、圆直径检测以及表面粗糙度分析等功能。整个过程从零开始,踩了不少坑,但也积累了不少经验。今天就来聊聊这个框架的设计和实现,顺便分享一些代码片段。


一、框架设计概述

整个框架的设计目标是通用性和扩展性。因为3D视觉的应用场景很多,所以我们希望这个框架能够支持多种测量任务,同时方便后续的功能扩展。

框架的核心模块包括:

  1. 数据采集模块:负责从3D相机获取深度图或点云数据。
  2. 数据处理模块:对原始数据进行预处理,比如去噪、滤波等。
  3. 特征提取模块:提取高度差、角度、直径等特征。
  4. 结果显示模块:将测量结果以可视化的方式呈现。

这里主要用到的是Halcon的强大图像处理功能,结合C#的面向对象特性,将各个模块封装成独立的类,方便后续调用。


二、高度差测量

高度差测量是3D视觉中一个基础但重要的功能。通过深度图可以很容易地计算出两个点之间的高度差。

代码示例:高度差计算

public class HeightDifferenceCalculator
{
    private HObject _depthMap;

    public HeightDifferenceCalculator(HObject depthMap)
    {
        _depthMap = depthMap;
    }

    public double CalculateHeightDifference(int x1, int y1, int x2, int y2)
    {
        // 获取两个点的深度值
        double z1 = GetDepthValue(x1, y1);
        double z2 = GetDepthValue(x2, y2);

        return Math.Abs(z1 - z2);
    }

    private double GetDepthValue(int x, int y)
    {
        // 假设深度图已经转换为二维数组
        return _depthMap[y, x];
    }
}

分析:

  • 这个类的核心是CalculateHeightDifference方法,它接收两个点的坐标,计算它们之间的高度差。
  • GetDepthValue方法用于从深度图中获取指定点的深度值。这里假设深度图已经被转换为二维数组,实际项目中可能需要根据Halcon的接口进行调整。

三、斜边角度计算

斜边角度的计算涉及到几何知识。通过已知两点的高度差和水平距离,可以计算出斜边的角度。

代码示例:斜边角度计算

public class SlopeAngleCalculator
{
    public double CalculateSlopeAngle(double heightDifference, double horizontalDistance)
    {
        // 计算斜边角度(弧度转角度)
        double angleRadians = Math.Atan(heightDifference / horizontalDistance);
        return Math.degrees(angleRadians);
    }
}

分析:

  • 这个方法的核心是使用反正切函数Math.Atan计算斜边的角度。
  • 注意单位转换,Halcon的深度图通常以毫米为单位,需要确保输入的单位一致。

四、圆直径检测

圆直径的检测在工业视觉中非常常见。Halcon提供了很多强大的算子,可以方便地实现圆检测。

代码示例:圆直径检测

public class CircleDiameterDetector
{
    private HObject _image;

    public CircleDiameterDetector(HObject image)
    {
        _image = image;
    }

    public double DetectCircleDiameter()
    {
        // 调用Halcon算子检测圆
        HOperatorSet.GenEmptyObj(out HObject circle);
        HOperatorSet.FindCircle(_image, out circle, "edges", "max", 100, 10, 10);

        // 获取圆的半径
        double radius;
        HOperatorSet.GetCircleParams(circle, out radius);

        // 直径是半径的两倍
        return radius * 2;
    }
}

分析:

  • 这个类使用了Halcon的FindCircle算子来检测图像中的圆。
  • 通过GetCircleParams方法获取圆的半径,然后计算直径。
  • 这里需要注意的是,Halcon的算子调用需要严格按照参数要求,否则可能会报错。

五、表面粗糙度分析

表面粗糙度的分析通常需要结合深度图的统计特性,比如深度的标准差或方差。

代码示例:表面粗糙度分析

public class SurfaceRoughnessAnalyzer
{
    private HObject _depthMap;

    public SurfaceRoughnessAnalyzer(HObject depthMap)
    {
        _depthMap = depthMap;
    }

    public double CalculateRoughness()
    {
        // 将深度图转换为二维数组
        double[,] depthArray = ConvertDepthMapToArray();

        // 计算平均值
        double mean = CalculateMean(depthArray);

        // 计算方差
        double variance = CalculateVariance(depthArray, mean);

        // 方差的平方根即为标准差,作为粗糙度指标
        return Math.Sqrt(variance);
    }

    private double[,] ConvertDepthMapToArray()
    {
        // 实现深度图到二维数组的转换
        // 这里需要根据Halcon的具体接口实现
        return new double[0, 0];
    }

    private double CalculateMean(double[,] array)
    {
        int rows = array.GetLength(0);
        int cols = array.GetLength(1);
        double sum = 0;

        for (int i = 0; i < rows; i++)
        {
            for (int j = 0; j < cols; j++)
            {
                sum += array[i, j];
            }
        }

        return sum / (rows * cols);
    }

    private double CalculateVariance(double[,] array, double mean)
    {
        int rows = array.GetLength(0);
        int cols = array.GetLength(1);
        double sum = 0;

        for (int i = 0; i < rows; i++)
        {
            for (int j = 0; j < cols; j++)
            {
                sum += Math.Pow(array[i, j] - mean, 2);
            }
        }

        return sum / (rows * cols);
    }
}

分析:

  • 这个类通过计算深度图的标准差来衡量表面粗糙度。
  • ConvertDepthMapToArray方法需要根据Halcon的具体接口实现,将深度图转换为二维数组。
  • CalculateMeanCalculateVariance方法分别计算平均值和方差,最后返回标准差作为粗糙度指标。

六、总结

以上就是我们用C#联合Halcon开发3D机器视觉框架的一些核心功能实现。整个框架的设计目标是通用性和扩展性,方便后续的功能扩展和优化。如果你对3D视觉感兴趣,可以尝试自己动手实现这些功能,或者根据自己的需求进行扩展。

最后,附上整个框架的源代码(部分展示):

public class MainFramework
{
    public static void Main()
    {
        // 初始化Halcon环境
        HalconWindow window = new HalconWindow();
        HObject image = window.ReadImage("test_image.png");

        // 创建高度差计算器
        HeightDifferenceCalculator heightCalculator = new HeightDifferenceCalculator(image);
        double heightDiff = heightCalculator.CalculateHeightDifference(100, 100, 200, 200);

        // 创建斜边角度计算器
        SlopeAngleCalculator slopeCalculator = new SlopeAngleCalculator();
        double slopeAngle = slopeCalculator.CalculateSlopeAngle(heightDiff, 100);

        // 创建圆直径检测器
        CircleDiameterDetector circleDetector = new CircleDiameterDetector(image);
        double diameter = circleDetector.DetectCircleDiameter();

        // 创建表面粗糙度分析器
        SurfaceRoughnessAnalyzer roughnessAnalyzer = new SurfaceRoughnessAnalyzer(image);
        double roughness = roughnessAnalyzer.CalculateRoughness();

        // 输出结果
        Console.WriteLine($"高度差:{heightDiff}mm");
        Console.WriteLine($"斜边角度:{slopeAngle}度");
        Console.WriteLine($"圆直径:{diameter}mm");
        Console.WriteLine($"表面粗糙度:{roughness}");
    }
}

希望这篇文章能帮助你更好地理解C#联合Halcon开发3D机器视觉框架的过程!如果有任何问题或建议,欢迎留言交流。

Logo

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

更多推荐