概述
一、官网方法
直接使用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 #返回的是两个值,颜色和形状
最后
以上就是清秀裙子为你收集整理的万无一失的OpenMV识别矩形、圆形、三角形方法一、官网方法二、使用识别色块的全部内容,希望文章能够帮你解决万无一失的OpenMV识别矩形、圆形、三角形方法一、官网方法二、使用识别色块所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复