C# 联合 Halcon 打造实用视觉处理 Demo:功能丰富超好用
C#联合halcon的demo 直线 找圆 形状模板匹配及等级识别等功能 功能有找直线,找圆,形状模板匹配,二维码识别及等级识别,相机内参标定,相机外参标定,以及几何测量 另外还有某论坛的开源控件,并且在该控件的基础上新增了文字显示,十字架中心基准,最重要的是“把涂抹功能”集合到了一起,并且测试无bug vs2019可以直接运行,halcon则是使用的18版本。 这个demo无论是学习还是封装都有很好的参考意义,大量节省个人时间。

最近捣鼓出了一个超有趣且实用的 C# 联合 Halcon 的 demo,迫不及待想跟大家分享一下。这个 demo 就像个视觉处理小能手,集成了好多厉害的功能。
一、主要功能大揭秘
- 找直线:在图像中精准定位直线可是很重要的。在 Halcon 里,通过一些算子就能实现。比如
edgessubpix算子,它能基于亚像素精度来检测边缘,从而帮助我们找到直线的线索。代码大概像这样:
// 假设已经加载了图像
HObject ho_Image;
HOperatorSet.ReadImage(out ho_Image, "your_image.jpg");
HObject ho_Edges;
HOperatorSet.EdgesSubPix(ho_Image, out ho_Edges, "canny", 2, 20, 40);
// 后续再通过其他算子从这些边缘中提取直线
这里先通过 EdgesSubPix 得到边缘,后续再进一步筛选出直线。它基于 Canny 边缘检测算法,2 代表边缘提取的平滑程度,20 和 40 分别是边缘检测的低阈值和高阈值,合理调整这些参数能让边缘提取效果更理想。
- 找圆:同样利用 Halcon 的算子,
find_circles就可以帮我们在图像里找到圆。示例代码:
HObject ho_Circles;
HOperatorSet.FindCircles(ho_Image, out ho_Circles, "circle", 5, 50, 100, 0, 0, 360, 2);
这里的参数 “circle” 是找圆的方法,5 是最小半径,50 是最大半径,100 是圆的圆度阈值,后面的 0, 0 是起始角度和终止角度相关参数,360 表示完整的圆,2 是亚像素精度相关参数。通过调整半径和圆度等参数,可以适应不同大小和形状规整程度的圆的查找。
- 形状模板匹配:这功能在工业检测等场景超有用。Halcon 提供了强大的模板匹配算子
findshapemodel。
// 先创建模板
HObject ho_Template;
HOperatorSet.ReadImage(out ho_Template, "template_image.jpg");
HTuple hv_ModelID;
HOperatorSet.CreateShapeModel(ho_Template, "auto", 0, 360, "auto", "auto", "use_polarity", "auto", "auto", out hv_ModelID);
// 然后在目标图像中匹配
HObject ho_SearchImage;
HOperatorSet.ReadImage(out ho_SearchImage, "search_image.jpg");
HTuple hv_Row, hv_Column, hv_Angle, hv_Score;
HOperatorSet.FindShapeModel(ho_SearchImage, hv_ModelID, 0, 360, 0.5, 1, 0.5, "least_squares", 0, 0.9, out hv_Row, out hv_Column, out hv_Angle, out hv_Score);
首先创建模板,这里用 CreateShapeModel 算子,“auto” 参数让 Halcon 自动选择一些参数。然后在搜索图像中用 FindShapeModel 匹配,0.5 是最小匹配分数,1 是最大匹配数量,0.5 是比例范围下限,“least_squares” 是匹配方法,0.9 是最小分数阈值。通过这些参数调整,可以提高匹配的准确性和效率。
- 二维码识别及等级识别:利用 Halcon 的二维码识别算子
readqrcode可以轻松实现。
HObject ho_QRImage;
HOperatorSet.ReadImage(out ho_QRImage, "qr_image.jpg");
HTuple hv_ResultHandles, hv_Info, hv_DecodedDataStrings;
HOperatorSet.ReadQrCode(ho_QRImage, out hv_ResultHandles, out hv_Info, out hv_DecodedDataStrings);
// 识别等级可能在 hv_Info 里进一步解析获取
直接读取二维码图像,就能得到结果句柄、信息和解析出的数据字符串。等级识别一般可以从返回的信息中进一步解析获取,具体方式根据 Halcon 的文档和实际返回信息来操作。
- 相机内参标定与外参标定:相机标定是机器视觉中很关键的一步。内参标定可以用 Halcon 提供的相关标定算子,比如
calibrate_cameras。外参标定也有相应的流程和算子配合。不过代码相对复杂些,这里简单提一下思路。
// 内参标定大概流程(实际需要准备标定板图像等数据)
HTuple hv_CameraParam, hv_Error;
HOperatorSet.CalibrateCameras(/* 这里传入标定相关数据 */, out hv_CameraParam, out hv_Error);
通过一系列操作获取到相机的内参参数 hvCameraParam 和误差 hvError,外参标定也是类似的根据实际场景和数据来调用算子实现。
- 几何测量:Halcon 里的
measure_pairs等算子可以进行几何测量。比如测量两条线之间的距离等。
// 假设已经有边缘等数据
HObject ho_EdgesForMeasure;
// 测量两条线之间的距离
HTuple hv_Distance;
HOperatorSet.MeasurePairs(ho_EdgesForMeasure, "dist_y", 10, 5, 20, 1, out hv_Distance);
这里用 MeasurePairs 测量 “dist_y” 方向(垂直方向)上的距离相关信息,10 是测量窗口大小,5 是最小长度,20 是最大长度,1 是亚像素精度。
二、开源控件的妙用与拓展
这个 demo 还用到了某论坛的开源控件,并且在其基础上进行了超实用的拓展。新增了文字显示功能,这样可以在处理后的图像上直接标注一些关键信息,比如识别到的物体类型、测量结果等。通过在控件的绘制事件里添加代码实现文字显示:
private void customControl_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
string textToShow = "识别到的圆数量: " + circleCount.ToString();
g.DrawString(textToShow, new Font("Arial", 12), Brushes.Black, 10, 10);
}
十字架中心基准功能则是方便在图像上确定一个精确的中心参考点,对于一些需要以中心为基准的测量或处理很有帮助。而把 “涂抹功能” 集合到一起更是个亮点,这个功能可以在图像上进行涂抹操作,比如标记感兴趣区域等。经过严格测试,在 vs2019 环境下可以直接运行,并且搭配的 Halcon 是 18 版本,非常稳定,没有出现任何 bug。

C#联合halcon的demo 直线 找圆 形状模板匹配及等级识别等功能 功能有找直线,找圆,形状模板匹配,二维码识别及等级识别,相机内参标定,相机外参标定,以及几何测量 另外还有某论坛的开源控件,并且在该控件的基础上新增了文字显示,十字架中心基准,最重要的是“把涂抹功能”集合到了一起,并且测试无bug vs2019可以直接运行,halcon则是使用的18版本。 这个demo无论是学习还是封装都有很好的参考意义,大量节省个人时间。

这个 demo 无论是对于想要学习 C# 与 Halcon 联合开发视觉处理项目的新手,还是想对已有功能进行封装,快速应用到实际项目中的开发者来说,都有极高的参考意义。它能大量节省个人时间,不用再从头一点点摸索各个功能的实现,直接拿来参考借鉴,简直不要太方便。希望大家也能从这个 demo 中获得灵感,开发出更棒的视觉处理应用!


AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)