Halcon 药水水平线检测

上结果:
在这里插入图片描述
上原图:
在这里插入图片描述
贴代码:

* 此示例代码,通过测量的手段,确定各瓶药水是否OK
* 药水水平线在容许的范围内为OK
* 药水水平线高于容许的范围或者低于容许的范围都为NG

* 读取图像
dev_close_window ()
dev_update_off ()
read_image (Image, 'ampoules/ampoules_01')
get_image_size (Image, Width, Height)
dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
dev_set_line_width (2)
dev_set_draw ('margin')
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')

* 增加显示图像的代码
dev_display (Image)

* 
* Create a model for the ampoule head to align the measure handle
* 创建模板
* 生成ROI矩形,不带方向的矩形
gen_rectangle1 (Rectangle, 230, 280, 317, 330)
* 抠图
reduce_domain (Image, Rectangle, ImageModel)
* 创建模板
create_shape_model (ImageModel, 'auto', 0, 0, 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID)
* 
* Initialize the measure handle
* 在原点处生成一个初始的测量矩形,得到测量句柄
gen_measure_rectangle2 (0, 0, rad(90), 75, 20, Width, Height, 'bilinear', MeasureHandle)
Tolerance := 15
* 
* Determine the fill level
NumImages := 8
for Index := 1 to NumImages by 1
    * 读取图像
    read_image (Image, 'ampoules/ampoules_' + Index$'.2d')
    ColumnEdges := []
    FillLevelHeight := []
    * 
    * 模板匹配,此步骤是为了定位每一个药瓶一个位置的中心点坐标
    * 为后续确定药水水平线的位置做准备
    find_shape_model (Image, ModelID, 0, 0, 0.7, 0, 0.1, 'least_squares', 0, 0.9, Row, Column, Angle, Score)
    * 对找到的所有,行坐标求平均值
    MeanRow := mean(Row)
    * 确定药水的水平线位置:以模板匹配获得的各个药水瓶的行坐标平均值为基准,
    * 获得药水线的基准参考位置
    RefLevel := MeanRow - 160
    * Display tolerance area
    dev_display (Image)
    dev_set_line_width (1)
    dev_set_color ('white')
    * 以基准容忍度为准,生成带方向的矩形
    gen_rectangle2 (AcceptLevel, RefLevel, mean(Column), 0, 30 + (max(Column) - min(Column)) / 2, Tolerance)
    dev_display (AcceptLevel)
    dev_set_line_width (2)
    * 
    *  Determine fill level of each ampoule
    Errors := 0
    for Idx := 0 to |Score| - 1 by 1
        * 平移MeasureHandle句柄对应的测量对象
        translate_measure (MeasureHandle, MeanRow - 135, Column[Idx])
        * Search for the topmost edge
        * 通过测量的方式,得到药水线的位置
        measure_pos (Image, MeasureHandle, 2, 7, 'all', 'first', RowEdge, ColumnEdge, Amplitude, Distance)
        * 下面的代码作用:显示各个药水瓶的药水线的位置,并且标识出是OK还是NG
        * 判断的标准是:测量获得药水线高度坐标与药水线参考高度之间不能超过设置的
        * 容忍范围(此处容忍范围是15)。
        * 超过容忍范围,为NG
        FillLevelHeight := [FillLevelHeight,RowEdge]
        ColumnEdges := [ColumnEdges,ColumnEdge]
        * 在此瓶药水的水平线处生成十字交叉
        gen_cross_contour_xld (Cross, RowEdge, ColumnEdge, 15, 0)
        * 以药水水平线中心点位基础生成矩形,小矩形
        gen_rectangle2 (FillLevel, RowEdge, ColumnEdge, 0, 28, 20)
        * 如果药水水平线超出可容忍范围,那么认为该瓶药水不合格
        if (abs(FillLevelHeight[Idx] - RefLevel) >= Tolerance)
            * 生成矩形,此矩形覆盖整个药水瓶
            gen_rectangle2 (ChamberSingle, MeanRow - 133, Column[Idx], 0, 35, 90)
            * 在此瓶药水的水平线处生成十字交叉
            gen_cross_contour_xld (Cross, FillLevelHeight[Idx], ColumnEdges[Idx], 15, 0)
            * 生成包括十字交叉的小矩形
            gen_rectangle2 (FillLevel, FillLevelHeight[Idx], ColumnEdges[Idx], 0, 28, 20)
            * 计数此图像中error的药水瓶个数
            Errors := Errors + 1
            dev_set_color ('red')
            dev_display (ChamberSingle)
            * 显示NG的信息
            disp_message (WindowHandle, 'NG', 'image', FillLevelHeight[Idx] - 50, ColumnEdges[Idx] - 10, 'red', 'false')
        else
            * 显示OK的信息
            disp_message (WindowHandle, 'OK', 'image', FillLevelHeight[Idx] - 50, ColumnEdges[Idx] - 10, 'green', 'false')
            dev_set_color ('green')
        endif
        dev_display (FillLevel)
        dev_display (Cross)
    endfor
    * 
    * Check, whether the fill level is within the allowed range - does not deviate too much
    * from average fill level
    * 
    * Display statistics
    if (Errors > 0)
        * 显示error的个数
        disp_message (WindowHandle, Errors + ' BAD', 'window', 10, 12, 'red', 'true')
    else
        * 显示所有都OK的信息
        disp_message (WindowHandle, 'All OK', 'window', 10, 12, 'forest green', 'true')
    endif
    if (Index < NumImages)
        disp_continue_message (WindowHandle, 'black', 'true')
        stop ()
    endif
endfor
* 
* 释放测量句柄资源
close_measure (MeasureHandle)
* 释放模板句柄资源
clear_shape_model (ModelID)
### 使用Halcon检测图像中的水平线和垂直线 在工业视觉应用中,精确地识别图像内的几何特征至关重要。HALCON 提供了一套强大的工具来实现这一目标。为了检测图像中的水平线和垂直线,通常会利用霍夫变换(Hough Transform),这是一种广泛应用于计算机视觉领域的方法。 #### 霍夫直线检测原理 通过设定 `AngleGap` 和 `DistGap` 参数,可以在极坐标系下定义候选直线的标准[^2]。具体来说,在本例程中设置为 5 度和 5 像素意味着如果某点在其周围的角度±5度范围内以及距离±5像素范围内的累积投票数超过了预设阈值,则认为该方向上存在一条潜在的直线。 对于水平线和垂直线而言: - **水平线**:这些线条具有接近于零或π的角度; - **垂直线**:则对应着大约 π/2 或者 -π/2 的角度; 因此可以通过调整霍夫变换算法中的参数来专门寻找这两种类型的直线。 #### 实现过程 1. 对输入灰度图执行边缘提取操作,得到二值化后的边界信息。 2. 利用 `hough_lines_contour_xld` 函数对上述获得的轮廓数据进行处理,从而找到满足条件的所有可能直线段,并返回它们的位置描述符(即XLD对象)[^3]。 3. 过滤掉不符合特定角度要求(如偏离90°过远的情况视为非垂直线,偏离0°过远的情况视为非水平线)的那些结果。 以下是基于Python接口调用HALCON库的一个简单示例代码片段展示如何完成这项任务: ```python import cv2 from pyhalcon import * # 初始化HALCON环境并加载图片 device = HDevEngine() proc = device.CreateProcedure('main') image_path = 'path_to_your_image' read_image(image=image_path) # 将彩色图像转换成灰度模式 rgb_to_gray(input=image, output=gray_img) # 执行Canny算子做边缘检测 edges_detection(gray_img, edges_result) # 设置霍夫变换参数以适应不同场景需求 set_system('angle_gap', 5) set_system('dist_gap', 5) # 寻找所有符合条件的直线(XLD形式表示) find_all_straight_lines(edges_result, all_lines) # 创建两个列表分别存储最终筛选出来的水平线与垂直线 horizontal_lines = [] vertical_lines = [] for line in all_lines: angle = get_line_angle(line) % math.pi if abs(angle - math.pi / 2) < tolerance: # 定义tolerance作为允许的最大偏差量级 vertical_lines.append(line) elif abs(angle) < tolerance or abs(angle - math.pi) < tolerance: horizontal_lines.append(line) draw_lines_on_image(horizontal_lines + vertical_lines, original_image) ``` 请注意此脚本仅为概念验证性质,实际部署时还需要考虑更多细节优化问题,比如性能瓶颈、抗噪能力等方面因素的影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

kay880

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

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

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

打赏作者

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

抵扣说明:

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

余额充值