矩形边缘识别+顶角坐标获取(摄像头视觉)
这篇文章主要介绍K210、V831、OpenMV的部分用法,以及心得体会
K210
例程:
rectangles = [] for r in img.find_rects(threshold=10000): rectangles.append(r) img.draw_rectangle(r.rect(), color=(255, 0, 0)) corners = r.corners() # 获取矩形的四个顶角坐标 corners = sort_corners_clockwise(corners) for i, p in enumerate(corners): img.draw_circle(p[0], p[1], 5, color=(0, 255, 0)) print("矩形顶角{}坐标:".format(chr(ord('A')+i)), p[0], p[1])rectangles = []:这是一个空列表,用于存储找到的矩形对象。for r in img.find_rects(threshold=10000)::这是一个循环,通过img.find_rects()函数找到图像中的矩形。threshold=10000是一个阈值,用于确定矩形的识别阈值。rectangles.append(r):将找到的矩形对象添加到rectangles列表中。img.draw_rectangle(r.rect(), color=(255, 0, 0)):在图像上绘制一个红色的矩形,位置和大小与找到的矩形对象r相同。corners = r.corners():获取矩形对象r的四个顶角坐标。sort_corners_clockwise(),这个函数的作用是将顶角坐标按顺时针顺序排序。for i, p in enumerate(corners)::对每个顶角坐标进行循环。img.draw_circle(p[0], p[1], 5, color=(0, 255, 0)):在顶角坐标位置绘制一个绿色的圆圈。print("矩形顶角{}坐标:".format(chr(ord('A')+i)), p[0], p[1]):打印出每个顶角的坐标,使用字母标识不同的顶角。
OpenMV
OpenMV使用的API与K210重合度很高,它们对矩形的识别都是用了 for r in img.find_rects()
- 例程
def sort_corners_clockwise(corners): # 按照顺时针方向对四个顶角坐标进行排序 sorted_corners = sorted(corners, key=lambda corner: corner[0]) top_corners = sorted_corners[:2] bottom_corners = sorted_corners[2:] top_corners = sorted(top_corners, key=lambda corner: corner[1]) bottom_corners = sorted(bottom_corners, key=lambda corner: corner[1], reverse=True) return top_corners + bottom_corners #寻找矩形 def opv_find_rectangles(img): rectangles = [] min_area_threshold = 1000 max_area_threshold = 15000 for r in img.find_rects(roi=(10, 0, 135, 120), threshold=20000): area = r.w() * r.h() # 计算矩形的面积 if area >= min_area_threshold and area <= max_area_threshold: rectangles.append(r) corners = r.corners() corners = sort_corners_clockwise(corners) for i, p in enumerate(corners): img.draw_circle(p[0], p[1], 5, color=(0, 255, 0)) print("矩形{}的顶角{}坐标:".format(len(rectangles), chr(ord('A') + i)), p[0], p[1]) return rectanglessort_corners_clockwise(): 这个函数用于对传入的顶点列表按照顺时针方向进行排序。首先,它按照 x 坐标进行排序,然后将排序后的顶点分成顶部和底部两部分。每部分分别按照 y 坐标排序。最终,按照排序后的顺序返回顶点列表。opv_find_rectangles(): 这个函数是用于在图像中寻找矩形。它使用了一个阈值来寻找图像中的矩形轮廓,并计算每个矩形的面积。如果面积在给定的阈值范围内,就将矩形添加到 rectangles 列表中。然后,它获取每个矩形的顶点坐标,并调用sort_corners_clockwise函数对顶点进行排序。最后,它在图像上绘制了每个顶点的圆圈,并打印出每个矩形的顶点坐标。

