使用OpenMV进行颜色识别和物料识别的Python代码解析
使用OpenMV进行颜色识别和物料识别
本博客文章将解析一段Python代码,该代码使用OpenMV平台实现颜色识别和物料识别。
if(WL_flag): # 识别物料
WL_flag
for blob in img.find_blobs([thresholds[0]],roi=[100,100,40,40], pixels_threshold=200, area_threshold=200, merge=True):
# 此处没有设置roi的值,便是对整个图像进行颜色识别
# 这些值取决于斑点不是圆形的——否则它们将是不稳定的。
if blob.elongation() > 0.5:
img.draw_edges(blob.min_corners(), color=(255,0,0))
img.draw_line(blob.major_axis_line(), color=(0,255,0))
img.draw_line(blob.minor_axis_line(), color=(0,0,255))
# These values are stable all the time.
img.draw_rectangle(blob.rect()) # 如果识别到了颜色,我们就在这个色块的周围画一个框把它圈出来
img.draw_cross(blob.cx(), blob.cy()) # 中间画一个十字,(blob.cx(), blob.cy())是色块的中心坐标
img.draw_keypoints([(blob.cx(), blob.cy(), int(math.degrees(blob.rotation())))], size=20)
# blob是find_blobs返回的参数
print('1')
uart.write('1\r\n')
for blob in img.find_blobs([thresholds[1]],roi=[100,100,40,40], pixels_threshold=200, area_threshold=200, merge=True):
# blob是find_blobs返回的参数
# 此处没有设置roi的值,便是对整个图像进行颜色识别
if blob.elongation() > 0.5:
img.draw_edges(blob.min_corners(), color=(255,0,0))
img.draw_line(blob.major_axis_line(), color=(0,255,0))
img.draw_line(blob.minor_axis_line(), color=(0,0,255))
# These values are stable all the time.
img.draw_rectangle(blob.rect()) # 如果识别到了颜色,我们就在这个色块的周围画一个框把它圈出来
img.draw_cross(blob.cx(), blob.cy()) # 中间画一个十字,(blob.cx(), blob.cy())是色块的中心坐标
img.draw_keypoints([(blob.cx(), blob.cy(), int(math.degrees(blob.rotation())))], size=20)
print('2')
uart.write('2\r\n')
for blob in img.find_blobs([thresholds[2]],roi=[100,100,40,40], pixels_threshold=200, area_threshold=200, merge=True):
# 此处没有设置roi的值,便是对整个图像进行颜色识别
# These values depend on the blob not being circular - otherwise they will be shaky.
if blob.elongation() > 0.5:
img.draw_edges(blob.min_corners(), color=(255,0,0))
img.draw_line(blob.major_axis_line(), color=(0,255,0))
img.draw_line(blob.minor_axis_line(), color=(0,0,255))
img.draw_rectangle(blob.rect()) # 如果识别到了颜色,我们就在这个色块的周围画一个框把它圈出来
img.draw_cross(blob.cx(), blob.cy()) # 中间画一个十字,(blob.cx(), blob.cy())是色块的中心坐标
img.draw_keypoints([(blob.cx(), blob.cy(), int(math.degrees(blob.rotation())))], size=20)
# blob是find_blobs返回的参数
print('3')
uart.write('3\r\n')
代码解析:
-
条件语句: 代码首先检查
WL_flag是否为真。 只有当WL_flag为真时,才会执行物料识别代码。 -
颜色识别: 代码使用
img.find_blobs函数在图像中查找特定颜色的斑点。thresholds变量包含了用于识别不同颜色的阈值。 -
斑点处理: 对于每个找到的斑点,代码会执行以下操作:
- 形状分析:
blob.elongation()用于判断斑点的形状是否细长。 - 绘制标记: 代码使用
img.draw_edges,img.draw_line,img.draw_rectangle,img.draw_cross和img.draw_keypoints函数在图像上绘制斑点的边缘、主轴线、次轴线、矩形框、十字和关键点。
- 形状分析:
-
信息输出: 代码通过串口 (
uart.write) 输出识别到的颜色信息 ('1', '2', '3')。
注意事项:
- ROI: 代码中的
roi参数用于设置感兴趣区域 (Region of Interest)。 通过设置 ROI,可以限制颜色识别在图像的特定区域内进行,提高效率。 - 阈值:
thresholds变量包含了用于识别不同颜色的阈值。 需要根据实际情况调整这些阈值,以确保准确识别颜色。 - 串口: 代码使用串口 (
uart) 与外部设备进行通信。 需要确保 OpenMV 与外部设备之间的串口连接正常。
这段代码提供了一个基本的框架,可以使用 OpenMV 进行颜色识别和物料识别。 可以根据实际需求对代码进行修改和扩展,例如添加更多的颜色识别、实现更复杂的形状分析、以及与其他传感器和执行器进行集成。
原文地址: https://www.cveoy.top/t/topic/bxom 著作权归作者所有。请勿转载和采集!