一、项目代码下载
项目的完整代码可以通过以下链接进行下载:
通过网盘分享的文件:垫片查找.7z
链接: https://pan.baidu.com/s/1cexsR99mMWcC2v0k0MJ5LQ?pwd=jkcf 提取码: jkcf
二、算法流程
图像预处理:
- 首先,通过
read_image
函数读取图像,并利用fast_threshold
函数进行图像的阈值化处理。阈值化后的图像会提取出强度值在特定范围内的区域,即可能包含垫片的部分。 - 采用
connection
函数将阈值区域连接起来,形成连通区域,并通过select_shape
根据面积和各向异性等特征进一步筛选出符合条件的区域。
- 首先,通过
生成感兴趣区域(ROI):
- 为了实现更精确的边缘检测,算法首先对筛选后的区域进行填充操作(
fill_up
),将选中的区域进行形状转换(shape_trans
),使其成为凸形状。 - 接着,提取这些区域的内边界(
boundary
),并对其进行膨胀(dilation_circle
),最终合并膨胀后的区域为一个完整的感兴趣区域(ROI)。
- 为了实现更精确的边缘检测,算法首先对筛选后的区域进行填充操作(
边缘检测:
- 使用
reduce_domain
函数限制边缘检测的区域范围,确保检测的区域仅限于感兴趣区域。 - 使用
edges_sub_pix
函数进行子像素级别的边缘检测,能够精确地检测到边缘的细节。
- 使用
轮廓合并:
- 采用
select_shape_xld
筛选符合一定长度要求的边缘线段,剔除不符合要求的短边缘。 - 通过
union_adjacent_contours_xld
合并相邻的边缘线段,形成完整的物体轮廓,方便后续的矩形拟合。
- 采用
矩形拟合:
- 使用
fit_rectangle2_contour_xld
对物体轮廓进行矩形拟合,得到每个垫片的中心位置、旋转角度、长短边的长度等参数。此步骤通过调整拟合方法中的参数,保证拟合结果的准确性。
- 使用
可视化:
- 通过
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
+---------------------------+
| 可视化 (显示拟合矩形) |
+---------------------------+