Halcon绘图实战:从基础几何到复合区域叠加的完整指南

张开发
2026/5/4 17:27:11 15 分钟阅读
Halcon绘图实战:从基础几何到复合区域叠加的完整指南
1. Halcon绘图基础从零开始画几何图形第一次接触Halcon绘图功能时我完全被那些参数搞晕了。直到在芯片检测项目中需要标注缺陷区域才真正理解这些基础图形的重要性。Halcon的绘图分为手动绘制和程序绘制两种方式就像用铅笔在纸上画图和在CAD软件里输入精确坐标的区别。手动绘制最常用的是draw_circle和draw_rectangle1这类函数。比如要画个圆只需要在图像窗口左键确定圆心拖动鼠标调整半径右键确认就完成了。实际项目中我经常用它快速框选感兴趣区域。但手动绘制的精度有限当需要精确到像素级时就得用程序绘制了。程序绘制的核心是gen_开头的函数族比如* 在(300,400)位置画半径为50的圆 gen_circle(Circle, 300, 400, 50)这里有个坑我踩过Halcon的坐标系统是(行,列)格式也就是(y,x)和常规的(x,y)顺序相反。第一次使用时我总把坐标输反导致图形位置完全不对。椭圆绘制更复杂些需要指定长轴方向角度Phi和两个半径* 中心(500,600)长轴方向30度长半径80短半径40 gen_ellipse(Ellipse, 500, 600, rad(30), 80, 40)注意Phi参数要用弧度制我习惯用rad()函数把角度转弧度比直接写0.5236这种数值直观多了。2. 进阶图形绘制技巧当基础图形玩熟练后就该挑战些特殊图形了。任意角度矩形在检测倾斜元件时特别有用它的参数设计很有讲究* 中心(700,800)纵轴方向45度长边半长100短边半长50 gen_rectangle2(Rect2, 700, 800, rad(45), 100, 50)这里Length1和Length2参数容易混淆。我记的方法是Length1对应的是与Phi方向平行的边的一半长度就像时钟的时针Length2则是垂直方向的半长类似分针。多边形绘制更灵活适合不规则区域* 手动绘制多边形 draw_region(Polygon, WindowHandle)在芯片引脚检测时我常用多边形框选不规则的焊点区域。但要注意手动绘制的顶点过多会影响后续处理速度通常控制在6-8个顶点比较合适。线条和点的绘制看似简单但在标定和测量中很关键* 从(100,200)到(300,400)画线 gen_region_line(Line, 100, 200, 300, 400)测量芯片引脚间距时我会先用线连接两个引脚中心再通过距离计算函数获取实际像素距离。3. 复合区域的高级玩法单独图形用处有限组合起来才强大。Halcon处理复合区域的核心思路是先创建空区域再不断叠加。就像拼乐高从底板开始一块块添加。* 创建空区域 gen_empty_region(CombinedRegion) * 叠加圆形区域 concat_obj(CombinedRegion, Circle, CombinedRegion) * 叠加矩形区域 concat_obj(CombinedRegion, Rect2, CombinedRegion)在芯片OCR项目中我需要同时标记字符区域和定位标记就用这种方法把多个图形合并成一个掩膜。更复杂的区域运算也很实用* 区域并集 union2(Region1, Region2, UnitedRegion) * 区域交集 intersection(Region1, Region2, IntersectedRegion) * 区域差集 difference(Region1, Region2, SubtractedRegion)有次处理芯片表面划痕时我需要检测特定形状区域内的划痕就用交集运算先限定检测范围大幅提高了准确率。4. 实战芯片检测完整流程结合一个真实案例看看如何用绘图功能完成芯片引脚检测首先读取图像并创建窗口read_image(Image, chip_01.png) get_image_size(Image, Width, Height) dev_open_window(0, 0, Width, Height, black, WindowHandle) dev_display(Image)绘制引脚定位标记* 四个角引脚用矩形标记 gen_rectangle1(Pin1, 50, 50, 150, 100) gen_rectangle1(Pin2, 50, Width-100, 150, Width-50) * 中间引脚用圆形标记 gen_circle(PinCenter, Height/2, Width/2, 30)创建复合检测区域gen_empty_region(DetectionROI) concat_obj(DetectionROI, Pin1, DetectionROI) concat_obj(DetectionROI, Pin2, DetectionROI) concat_obj(DetectionROI, PinCenter, DetectionROI)应用区域进行检测* 限制检测范围 reduce_domain(Image, DetectionROI, ImageReduced) * 执行实际检测算法 ...这个流程的关键在于合理设计复合区域。我通常会先用手动绘制确定大致范围再改用程序绘制微调参数最后用区域运算优化检测范围。调试时可以通过dev_set_color设置不同颜色直观看到各个区域的叠加效果。绘图功能看似基础但灵活运用能解决很多复杂问题。有次遇到反光严重的芯片我通过绘制多个椭圆区域组合成特殊形状的掩膜有效抑制了反光干扰。Halcon的绘图就像视觉工程师的素描本能把抽象算法转化为具体的区域设计。

更多文章