万无一失的OpenMV识别矩形、圆形、三角形方法

一、官网方法

直接使用find_circles()和find_rects()识别矩形和圆形,使用find_lines()函数寻找三条直线,利用三角形内角和180°来识别三角形。
find_circles()详解
万无一失的OpenMV识别矩形、圆形、三角形方法_第1张图片
find_rects()详解
万无一失的OpenMV识别矩形、圆形、三角形方法_第2张图片
find_lines()详解
万无一失的OpenMV识别矩形、圆形、三角形方法_第3张图片
认真看手册!认真看手册!认真看手册!重要问题说三遍!
给函数赋予的参数对最终识别效果影响非常大,一定一定要认真理解参数,然后耐心调参。
我在用这几个函数时,要么识别很多要么都识别不到,解决办法就是对图像进一步处理或者进行滤波。在背景杂乱的情况下,三角形用这个方法识别误差会很大。

二、使用识别色块

我的方法主要是识别色块,先识别颜色再识别形状,缩小判断范围。
官网手册find_blobs()详解
主要使用了函数blob.density(),返回色块的密度。这等于色块的像素数除以外框的区域。对于正视的矩形,该值应等于1,对于正视的圆形,该值应等于π/4;对于正视的三角形,则小于0.5。但实际情况是,摄像头不一定正视,再加其他因素的影响,使得这个值会上下浮动。最有效的调参方法是:先分别print矩形、圆形、三角形的density(),看大致范围后再决定参数。
代码如下:

def detect(max_blob):#输入的是寻找到色块中的最大色块
    row_data=[-1,-1]#保存颜色和形状
    print(max_blob.solidity())
  
    if max_blob.density()>0.84:
        row_data[0]=max_blob.code()
        img.draw_rectangle(max_blob.rect())
        row_data[1]=1#表示矩形

    elif max_blob.density()>0.6:
        img.draw_circle((max_blob.cx(), max_blob.cy(),int((max_blob.w()+max_blob.h())/4)))
        row_data[0]=max_blob.code()
        row_data[1]=2#表示圆形
    elif max_blob.density()>0.4:
        row_data[0]=max_blob.code()
        row_data[1]=3#表示三角形
    return row_data#返回的是两个值,颜色和形状

原本到这里已经结束了,但一直存在一个问题:矩形如果倾斜一个角度或者旋转过,计算出的density()值确实跟圆形很接近,有时候会识别成圆形,但再往下调又会将圆形识别成矩形。
经过一个同学指导,才知道有个函数max_blob.solidity(),星瞳科技里面没有提及。这个函数配合识别矩形。
最终代码:

def detect(max_blob):#输入的是寻找到色块中的最大色块
    row_data=[-1,-1]#保存颜色和形状
    print(max_blob.solidity())
  
    if max_blob.solidity()>0.9 or max_blob.density()>0.84:
        row_data[0]=max_blob.code()
        img.draw_rectangle(max_blob.rect())
        row_data[1]=1#表示矩形

    elif max_blob.density()>0.6:
        img.draw_circle((max_blob.cx(), max_blob.cy(),int((max_blob.w()+max_blob.h())/4)))
        row_data[0]=max_blob.code()
        row_data[1]=2#表示圆形
    elif max_blob.density()>0.4:
        row_data[0]=max_blob.code()
        row_data[1]=3#表示三角形
    return row_data #返回的是两个值,颜色和形状

你可能感兴趣的:(单片机,视觉检测)