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

一、官网方法
直接使用()和()识别矩形和圆形,使用()函数寻找三条直线,利用三角形内角和180°来识别三角形 。
()详解
()详解
()详解
认真看手册!认真看手册!认真看手册!重要问题说三遍!
给函数赋予的参数对最终识别效果影响非常大,一定一定要认真理解参数,然后耐心调参 。
我在用这几个函数时,要么识别很多要么都识别不到,解决办法就是对图像进一步处理或者进行滤波 。在背景杂乱的情况下,三角形用这个方法识别误差会很大 。
二、使用识别色块
我的方法主要是识别色块,先识别颜色再识别形状,缩小判断范围 。
官网手册()详解

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

文章插图
主要使用了函数blob.(),返回色块的密度 。这等于色块的像素数除以外框的区域 。对于正视的矩形,该值应等于1,对于正视的圆形,该值应等于π/4;对于正视的三角形,则小于0.5 。但实际情况是,摄像头不一定正视,再加其他因素的影响,使得这个值会上下浮动 。最有效的调参方法是:先分别print矩形、圆形、三角形的(),看大致范围后再决定参数 。
代码如下:
def detect(max_blob):#输入的是寻找到色块中的最大色块row_data=http://www.kingceram.com/post/[-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#返回的是两个值,颜色和形状
原本到这里已经结束了,但一直存在一个问题:矩形如果倾斜一个角度或者旋转过,计算出的()值确实跟圆形很接近,有时候会识别成圆形,但再往下调又会将圆形识别成矩形 。
经过一个同学指导,才知道有个函数.(),星瞳科技里面没有提及 。这个函数配合识别矩形 。
最终代码:
【万无一失的OpenMV识别矩形、圆形、三角形方法】def detect(max_blob):#输入的是寻找到色块中的最大色块row_data=http://www.kingceram.com/post/[-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 #返回的是两个值,颜色和形状