halcon 中的药片检查check_blister实例注释

本文介绍了一种利用HALCON进行药片自动计数及质量检查的算法,通过图像处理技术定位并分割药片,进而识别并分类药片,最后根据图像特征评估药片的质量,实现自动化药片检测。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

* This example demonstrates an application from the pharmaceutical
* industry. The task is to check the content of automatically filled
* blisters. The first image (reference) is used to locate the chambers
* within a blister shape as a reference model, which is then used to
* realign the subsequent images along to this reference shape. Using
* blob analyses the content of each chamber is segmented and finally
* classified by a few shape features.
* 先生成标准区域,然后按新的图片区域与标准区域交集的灰度和面积来判定缺陷.


dev_close_window ()
dev_update_off ()
read_image (ImageOrig, 'blister/blister_reference')
dev_open_window_fit_image (ImageOrig, 0, 0, -1, -1, WindowHandle)
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
dev_set_draw ('margin')
dev_set_line_width (3)

* In the first step, we create a pattern to cut out the chambers in the
* subsequent blister images easily.
*二值化,选取大于90小于255的灰度区域 
dev_display(ImageOrig)
threshold (ImageOrig, Region, 90, 255)
dev_clear_window()
dev_display(Region)
*区域凸包变换.变换后区域就规范了.
shape_trans (Region, Blister, 'convex')
*区域的定向
orientation_region (Blister, Phi)
*求出区域中心点和角度
area_center (Blister, Area1, Row, Column)
*图片刚性变换,只是角度变化,这下摆正了.
vector_angle_to_rigid (Row, Column, Phi, Row, Column, 0, HomMat2D)
affine_trans_image (ImageOrig, Image2, HomMat2D, 'constant', 'false')
dev_display(ImageOrig)
stop()
dev_clear_window()
dev_display(Image2)
stop()
*创建一个空的对象
gen_empty_obj (Chambers)
for I := 0 to 4 by 1
    Row := 88+I*70
    for J := 0 to 2 by 1
        Column := 163 + J*150
        gen_rectangle2 (Rectangle, Row, Column, 0, 64, 30)
        *加入rectangle对象到空对象中
        concat_obj (Chambers, Rectangle, Chambers)
    endfor
endfor
*区域变换,把区域摆正.
affine_trans_region (Blister, Blister, HomMat2D, 'false')
*差运算生成网格
difference (Blister, Chambers, Pattern)
*并运算
union1 (Chambers, ChambersUnion)
*求出区域方向.
orientation_region (Blister, PhiRef)

PhiRef := rad(180)+PhiRef


*求出中心点
area_center (Blister, Area2, RowRef, ColumnRef)


* Each image read will be aligned to this pattern and reduced to the area of interest,
* which is the chambers of the blister
Count := 6
for Index := 1 to Count by 1
    read_image (Image, 'blister/blister_'+Index$'02')
    threshold (Image, Region, 90, 255)
    connection (Region, ConnectedRegions)
    select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 5000, 9999999)
    shape_trans (SelectedRegions, RegionTrans, 'convex')
    * 
    * align pattern along blister of image
    orientation_region (RegionTrans, Phi)
    area_center (RegionTrans, Area3, Row, Column)
    *仿射变换,角度和点都有变化.
    vector_angle_to_rigid (Row, Column, Phi, RowRef, ColumnRef, PhiRef, HomMat2D)
    affine_trans_image (Image, ImageAffinTrans, HomMat2D, 'constant', 'false')
    * 
    * segment pills
    dev_clear_window()
    dev_display(ImageAffinTrans)

    reduce_domain (ImageAffinTrans, ChambersUnion, ImageReduced)

   *分离彩色通道

    decompose3 (ImageReduced, ImageR, ImageG, ImageB)
    *阀值分割,较好地分开前景和背景
    var_threshold (ImageB, Region, 7, 7, 0.2, 2, 'dark')
    *连通区域
    connection (Region, ConnectedRegions0)
    * 闭运算,填充的效果
    closing_rectangle1 (ConnectedRegions0, ConnectedRegions, 3, 3)
    *填充
    fill_up (ConnectedRegions, RegionFillUp)
    *选择区域
    select_shape (RegionFillUp, SelectedRegions, 'area', 'and', 1000, 99999)
    *开运算.去掉小干扰点
    opening_circle (SelectedRegions, RegionOpening, 4.5)
    *再次连通区域
    connection (RegionOpening, ConnectedRegions)
    *选择区域
    select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 1000, 99999)
    *凸包变换
    shape_trans (SelectedRegions, Pills, 'convex')
    * 

    * classify segmentation results and display statistics


    *计算对象
    count_obj (Chambers, Number)
    gen_empty_obj (WrongPill)
    gen_empty_obj (MissingPill)
    for I := 1 to Number by 1
        *选择标准对象
        select_obj (Chambers, Chamber, I)
        *交集
        intersection (Chamber, Pills, Pill)
        *计算交集中心点和面积
        area_center (Pill, Area, Row1, Column1)
        if (Area > 0)
            *计算最大最小灰度值
            min_max_gray (Pill, ImageB, 0, Min, Max, Range)
            if (Area<3800 or Min < 60)
                concat_obj (WrongPill, Pill, WrongPill)
            endif
        else
            concat_obj (MissingPill, Chamber, MissingPill)
        endif
    endfor
    * 
    dev_clear_window ()
    dev_display (ImageAffinTrans)
    dev_set_color ('forest green')
    count_obj (Pills, NumberP)
    count_obj (WrongPill, NumberWP)
    count_obj (MissingPill, NumberMP)
    dev_display (Pills)
    if (NumberMP > 0 or NumberWP > 0)
        disp_message (WindowHandle, 'Not OK', 'window', 10, 10+600, 'red', 'true')
    else
        disp_message (WindowHandle, 'OK', 'window', 10, 10+600, 'forest green', 'true')
    endif
    disp_message (WindowHandle, '# correct pills: ' + (NumberP - NumberWP), 'window', 10, 10, 'black', 'true')
    disp_message (WindowHandle, '# wrong pills  :  ' + NumberWP, 'window', 10+25, 10, 'black', 'true')
    if (NumberWP>0)
        disp_message (WindowHandle, NumberWP, 'window', 10+25, 10+180, 'red', 'true')
    endif
    disp_message (WindowHandle, '# missing pills:  ' + NumberMP, 'window', 10+50, 10, 'black', 'true')
    if (NumberMP > 0)
        disp_message (WindowHandle, NumberMP, 'window', 10+50, 10+180, 'red', 'true')
    endif
    dev_set_color ('red')
    dev_display (WrongPill)

    dev_display (MissingPill)


    if (Index < Count)
        disp_continue_message (WindowHandle, 'black', 'true')
    endif
    stop ()
endfor
主题推荐
注释 实例 application statistics 对象
<think>我们正在解释Halcon中的`get_dict_object`函数。根据引用[1]的内容,字典(dict)在Halcon中类似于关联数组,可以存储键值对,其中键可以是整数或字符串,值可以是元组(tuple)或图标对象(iconic object)。`get_dict_object`函数用于从字典中检索与指定键关联的图标对象。 ### Halcon `get_dict_object` 函数说明 #### 函数签名 ```halcon get_dict_object( : Object : DictHandle, Key : ) ``` #### 参数说明 1. **Object** (输出参数):从字典中获取的图标对象(例如:图像、区域、XLD轮廓等) 2. **DictHandle** (输入参数):字典的句柄,通过`create_dict`创建 3. **Key** (输入参数):要检索的键(整数或字符串) #### 功能描述 - 从字典中获取与指定`Key`关联的图标对象(iconic object) - 图标对象是Halcon中表示图像数据的对象类型,包括: - 图像(images) - 区域(regions) - XLD轮廓(XLD contours) - 如果键不存在或键对应的值不是图标对象类型,则会抛出异常 #### 使用示例 ```halcon * 创建空字典 create_dict(DictHandle) * 生成一个矩形区域 gen_rectangle1(Rectangle, 100, 100, 300, 200) * 将矩形区域存入字典,键为"roi" set_dict_object(Rectangle, DictHandle, 'roi') * ... 其他操作 ... * 从字典中取出键为"roi"的图标对象 get_dict_object(RegionObject, DictHandle, 'roi') * 此时RegionObject即为之前存储的矩形区域 ``` #### 异常处理 - 当字典中不存在指定的键时,错误代码:1302(H_ERR_DICTKEY) - 当键存在但值不是图标对象时,错误代码:1303(H_ERR_DICTVAL) #### 注意事项 1. 使用前必须确保字典已通过`create_dict`创建 2. 键的类型必须与存储时一致(字符串或整数) 3. 图标对象在字典中通过引用存储,不会复制新对象 4. 可通过`get_dict_param`检查键是否存在或查询值类型 #### 相关函数 - `create_dict`:创建字典 - `set_dict_object`:存储图标对象到字典 - `get_dict_tuple`:获取元组类型的值 - `set_dict_tuple`:存储元组到字典 - `get_dict_param`:获取字典元信息[^1] --- §§相关问题§§ 1. 如何安全地检查字典中是否存在某个键? 2. Halcon字典支持哪些数据类型的键和值? 3. `get_dict_object`和`get_dict_tuple`在性能上有何差异? 4. 如何遍历Halcon字典中的所有键值对?</think>### Halcon `get_dict_object` 函数说明 `get_dict_object` 是 Halcon 字典操作的核心函数之一,用于从字典中检索存储的**图标对象**(iconic objects)。这些对象包括图像、区域、XLD轮廓等视觉处理元素[^1]。 #### 函数签名 ```halcon get_dict_object( : Object : DictHandle, Key : ) ``` #### 参数说明 1. **Object** (输出):检索到的图标对象(图像/区域/XLD等) 2. **DictHandle** (输入):字典句柄(由`create_dict`创建) 3. **Key** (输入):检索键(整数或字符串) #### 功能特点 1. **对象类型支持**: - 图像对象(`HImage`) - 区域对象(`HRegion`) - XLD轮廓(`HXLD`) - 控制参数对象(`HData`) ```halcon * 示例:获取存储的图像对象 get_dict_object(Image, DictHandle, 'camera_image') ``` 2. **键值匹配规则**: - 精确匹配键名(区分大小写) - 支持整数键(如`1`)和字符串键(如`"roi_mask"`) - 键不存在时抛出异常(错误代码:1302) 3. **内存管理**: - 返回对象的引用(非复制),原始对象修改会影响字典中的值 - 对象生命周期与字典绑定(字典销毁时对象自动释放) #### 使用示例 ```halcon * 创建字典并存储区域对象 create_dict(DictHandle) gen_rectangle1(Rectangle, 100, 100, 300, 200) set_dict_object(Rectangle, DictHandle, 'processing_roi') * 从字典获取区域对象并处理 get_dict_object(ROI, DictHandle, 'processing_roi') reduce_domain(Image, ROI, ImageReduced) ; 使用区域裁剪图像 ``` #### 错误处理 ```halcon try get_dict_object(Obj, DictHandle, 'invalid_key') catch (Exception) * 处理键不存在异常(H_ERR_DICTKEY) dev_inspect_ctrl (Exception) endtry ``` #### 典型应用场景 1. **参数传递**:在复杂算法中传递中间处理结果 ```halcon * 存储分割结果 set_dict_object(SegmentedRegions, DictHandle, 'step3_result') ``` 2. **工作流状态保存**:保存多阶段处理的状态对象 ```halcon * 获取前一帧的处理结果 get_dict_object(PrevTrackingData, DictHandle, 'frame_'+ (Index-1)) ``` 3. **动态配置**:根据键名加载不同的处理模板 ```halcon get_dict_object(Template, DictHandle, 'template_'+ProductType) ``` #### 与`get_dict_tuple`的区别 | 特性 | `get_dict_object` | `get_dict_tuple` | |------|-------------------|------------------| | 数据类型 | 图标对象(图像/区域等) | 元组(数值/字符串) | | 内存占用 | 高(引用实际像素数据) | 低(仅标量数据) | | 典型用途 | 视觉数据处理 | 参数配置存储 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值