这篇文章主要介绍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])
    
    1. rectangles = []:这是一个空列表,用于存储找到的矩形对象。

    2. for r in img.find_rects(threshold=10000)::这是一个循环,通过img.find_rects()函数找到图像中的矩形。threshold=10000是一个阈值,用于确定矩形的识别阈值。

    3. rectangles.append(r):将找到的矩形对象添加到rectangles列表中。

    4. img.draw_rectangle(r.rect(), color=(255, 0, 0)):在图像上绘制一个红色的矩形,位置和大小与找到的矩形对象r相同。

    5. corners = r.corners():获取矩形对象r的四个顶角坐标。

    6. sort_corners_clockwise(),这个函数的作用是将顶角坐标按顺时针顺序排序。

    7. for i, p in enumerate(corners)::对每个顶角坐标进行循环。

    8. img.draw_circle(p[0], p[1], 5, color=(0, 255, 0)):在顶角坐标位置绘制一个绿色的圆圈。

    9. 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 rectangles
    
    1. sort_corners_clockwise(): 这个函数用于对传入的顶点列表按照顺时针方向进行排序。首先,它按照 x 坐标进行排序,然后将排序后的顶点分成顶部和底部两部分。每部分分别按照 y 坐标排序。最终,按照排序后的顺序返回顶点列表。

    2. opv_find_rectangles(): 这个函数是用于在图像中寻找矩形。它使用了一个阈值来寻找图像中的矩形轮廓,并计算每个矩形的面积。如果面积在给定的阈值范围内,就将矩形添加到 rectangles 列表中。然后,它获取每个矩形的顶点坐标,并调用 sort_corners_clockwise 函数对顶点进行排序。最后,它在图像上绘制了每个顶点的圆圈,并打印出每个矩形的顶点坐标。

V831