Halcon中如何对特定目标进行定位查找

发布于:2025-06-23 ⋅ 阅读:(19) ⋅ 点赞:(0)

一、项目代码下载

项目的完整代码可以通过以下链接进行下载:

通过网盘分享的文件:垫片查找.7z
链接: https://pan.baidu.com/s/1cexsR99mMWcC2v0k0MJ5LQ?pwd=jkcf 提取码: jkcf

二、算法流程

  1. 图像预处理:

    • 首先,通过 read_image 函数读取图像,并利用 fast_threshold 函数进行图像的阈值化处理。阈值化后的图像会提取出强度值在特定范围内的区域,即可能包含垫片的部分。
    • 采用 connection 函数将阈值区域连接起来,形成连通区域,并通过 select_shape 根据面积和各向异性等特征进一步筛选出符合条件的区域。
  2. 生成感兴趣区域(ROI):

    • 为了实现更精确的边缘检测,算法首先对筛选后的区域进行填充操作(fill_up),将选中的区域进行形状转换(shape_trans),使其成为凸形状。
    • 接着,提取这些区域的内边界(boundary),并对其进行膨胀(dilation_circle),最终合并膨胀后的区域为一个完整的感兴趣区域(ROI)。
  3. 边缘检测:

    • 使用 reduce_domain 函数限制边缘检测的区域范围,确保检测的区域仅限于感兴趣区域。
    • 使用 edges_sub_pix 函数进行子像素级别的边缘检测,能够精确地检测到边缘的细节。
  4. 轮廓合并:

    • 采用 select_shape_xld 筛选符合一定长度要求的边缘线段,剔除不符合要求的短边缘。
    • 通过 union_adjacent_contours_xld 合并相邻的边缘线段,形成完整的物体轮廓,方便后续的矩形拟合。
  5. 矩形拟合:

    • 使用 fit_rectangle2_contour_xld 对物体轮廓进行矩形拟合,得到每个垫片的中心位置、旋转角度、长短边的长度等参数。此步骤通过调整拟合方法中的参数,保证拟合结果的准确性。
  6. 可视化:

    • 通过 gen_rectangle2_contour_xld 根据拟合结果生成矩形轮廓,并在图像上显示拟合矩形,便于观察和验证检测效果。
    • 最后,使用 dev_display 显示原始图像以及拟合得到的矩形,以便于进一步分析和应用。

三、代码实现

以下是完整的项目代码实现:

* 该程序演示了如何在图像中找到垫片,并如何使用 fit_rectangle2_contour_xld 可靠准确地确定其位置、旋转角度和大小。
dev_update_pc ('off')          
dev_update_window ('off')     
dev_update_var ('off')        

* 读取图像文件
read_image (Image, 'die_pads')

* 关闭当前所有窗口
dev_close_window ()

* 获取图像的宽度和高度
get_image_size (Image, Width, Height)

* 打开一个黑色背景的窗口
dev_open_window(0, 0, Width * 2, Height * 2, 'black', WindowHandle)

* 设置窗口显示区域为整个图像
dev_set_part (0, 0, Height - 1, Width - 1)

* 通过阈值化提取图像中的区域
fast_threshold (Image, Region, 180, 255, 20)

* 连接阈值区域,形成连通区域
connection (Region, ConnectedRegions)

* 根据形状特征(如面积和各向异性)选择符合条件的区域
select_shape (ConnectedRegions, SelectedRegions, ['area', 'anisometry'], 'and', [200, 1], [1200, 2])

* 生成用于子像素级精确边缘检测的感兴趣区域(ROI)
fill_up (SelectedRegions, RegionFillUp)      

* 将填充区域转换为凸形状
shape_trans (RegionFillUp, RegionTrans, 'convex')

* 提取凸形状的内边界
boundary (RegionTrans, RegionBorder, 'inner')

* 对边界区域进行膨胀处理
dilation_circle (RegionBorder, RegionDilation, 2.5)

* 合并膨胀后的区域
union1 (RegionDilation, RegionUnion)

* 将处理区域限制在选定的感兴趣区域内
reduce_domain (Image, RegionUnion, ImageReduced)

* 进行子像素级的边缘检测
edges_sub_pix (ImageReduced, Edges, 'sobel_fast', 0.5, 20, 40)

* 筛选边缘线段,选择符合长度要求的边缘线段
select_shape_xld (Edges, SelectedContours, 'contlength', 'and', 10, 200)

* 合并相邻的边缘线段,形成完整的轮廓
union_adjacent_contours_xld (SelectedContours, UnionContours, 2, 1, 'attr_keep')

* 拟合矩形到轮廓,以确定每个垫片的大小、位置和旋转角度
fit_rectangle2_contour_xld (UnionContours, 'tukey', -1, 0, 0, 3, 2, Row, Column, Phi, Length1, Length2, PointOrder)

* 根据拟合结果生成矩形轮廓
gen_rectangle2_contour_xld (Rectangle, Row, Column, Phi, Length1, Length2)

* 显示原图
dev_display (Image)

* 设置矩形的颜色为紫色
dev_set_colored (12)

* 显示拟合出的矩形
dev_display (Rectangle)

四、算法示意图

下图展示了本项目的算法流程:

+--------------------+
|  读取图像 ('die_pads') |
+--------------------+
           |
           v
+----------------------+
|   图像预处理 (阈值化)  |
+----------------------+
           |
           v
+---------------------------+
|  生成感兴趣区域(ROI)     |
+---------------------------+
           |
           v
+-----------------------+
|     边缘检测 (子像素)   |
+-----------------------+
           |
           v
+----------------------+
|  合并相邻的边缘线段    |
+----------------------+
           |
           v
+-------------------------------+
| 拟合矩形到物体轮廓 (fit_rectangle2) |
+-------------------------------+
           |
           v
+---------------------------+
|  可视化 (显示拟合矩形)    |
+---------------------------+

网站公告

今日签到

点亮在社区的每一天
去签到