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

您所在的位置:网站首页 openmv形状识别和坐标返回 万无一失的OpenMV识别矩形、圆形、三角形方法

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

2023-08-01 21:42| 来源: 网络整理| 查看: 265

一、官网方法

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

二、使用识别色块

我的方法主要是识别色块,先识别颜色再识别形状,缩小判断范围。 官网手册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 #返回的是两个值,颜色和形状


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3