Open mv识别图形形状及颜色


前言

本博客是第一次新路尝试,主要内容在于说说一些个人心得。如果能够帮到读者或者给到一点启发,不胜荣幸!如若有瑕疵还希望得到中肯的意见。谢谢,鞠躬。
本人是一名刚上大四的初学者,目前有些关于Open mv一些个人的见解,在这个平台与大家分享。
联系方式:
QQ:748615835 Wechat:15215615301


带着问题来看

1.识别形状的函数如何使用
2.三角形识别困难大坑
3.矩形识别误差大,干扰太多
4.圆形识别误差大,小圆干扰不可避免

一、函数

使用函数:

img.find_circles、find.line_segments、img.find_rects、img.find_template

二、使用方法

1.img.find_circles

使用方法:

image.find_circles([roi[, x_stride=2[, y_stride=1[, threshold=2000
[, x_margin=10[, y_margin=10[, r_margin=10[, r_min=2[, r_max[, r_step=2]]]]]]]]]])
    # Circle对象有四个值: x, y, r (半径), 和 magnitude。
    # x_stride 是霍夫变换时需要跳过的x像素的数量。若已知圆较大,可增加 x_stride 。
    # y_stride 是霍夫变换时需要跳过的y像素的数量。若已知圆较大,可增加 y_stride 。
    # roi 是一个用以复制的矩形的感兴趣区域(x, y, w, h)。
    # threshold 控制从霍夫变换中监测到的圆。只返回大于或等于 threshold 的圆。
    # r_step 控制如何逐步检测半径。默认为2
    # r_min 控制检测到的最小圆半径。增加此值可以加速算法。默认为2
    

2.img.find_rects

image.find_rects([roi=Auto, threshold=10000])
#threshold 小于 threshold 的矩形会从返回列表中过滤出来
#roi 是一个用以复制的矩形的感兴趣区域(x, y, w, h)。

3.find.line_segments

image.find_line_segments([roi[, merge_distance=0[, max_theta_difference=15]]])
#merge_distance 指定两条线段之间的可以相互分开而不被合并的最大像素数。
#max_theta_difference 是上面 merge_distancede 要合并的的两个线段的最大角度差值。
#

三、摄像情况及终端结果

1.img.find_circles

for c in img.find_circles(threshold = 3500, x_margin =2, y_margin =2, r_margin = 10,r_min = 5,r_max = 100, r_step = 2):	
	
	img.draw_circle(c.x(), c.y(), c.r(), color = (255, 0, 0))

在这里插入图片描述

该方法几乎定死了使用对象——只能是圆,这里没有说明好说的,就是注意后面的参数。
第一个是x_stride、y_stride:它可以帮助你更快的查找到圆形,在识别大圆上有突出的效果,我几乎使用必用;

第二个是threshold:它可以帮助你过滤掉一些小圆的干扰,它限制了返回的圆的大小,在一些圆形或者复杂背景下 它可以很好帮到你;

第三个是 r_min,r_max:它限制了识别圆半径的大小;

第四个是r_step: 控制如何逐步检测半径。这个可以很好的让你的圆不断跳着检测圆,跨越多大地半径长度去识别圆。

2.img.find_rects

for r in img.find_rects(threshold = 20000):

        img.draw_rectangle(r.rect(), color = (255, 0, 0))

在这里插入图片描述

矩形识别就有些技巧了。你需要知道矩形识别时根据图形地四个角来判断该图形是否位矩形,AprilTag的quad detection可以处理任意缩放/旋转/剪切的矩形,所以摄像头会将一切与矩形相似的图形识别为矩形。你需要注意以下几个参数:
第一个是ROI: 是一个用以复制的矩形的感兴趣区域(x, y, w, h)。如果未指定,ROI即图像矩形。因为它的限制,Open mv的操作范围仅限于 roi 区域内的像素。必设参数,没有之一。
第二个是threshold:一切小于 threshold 的矩形会从返回列表中过滤出来。必设参数,没有之一。

3.find.line_segments

 for l in img.find_line_segments(merge_distance = 10, max_theta_diff = 10):
        img.draw_line(l.line(), color = (255, 0, 0))
        sum += l.theta()
    sum -= 180
    
    if sum<110 and sum>1:
        print('三角形')
        num_segment=1

在这里插入图片描述

首先我们来解释下为什么线段识别可以用来识别三角形。线段识别会在图形的边缘画出线段来描出形状,类似与描边。而每条边具有角度的参数,函数line.theta():返回霍夫变换后的直线的角度(0-179度)。利用三角形三个边角度的和小于等于180度来完成三角形的识别。

写在最后

本文只讲了基础的函数利用,及函数的部分变形。下一个文章将主要介绍主要颜色识别函数的利用、及颜色形状识别函数的搭配使用,如果字数不多的话可以讲下代码使用时遇到的问题及解决办法。如果您有相关的问题欢迎与我沟通,虽然本人尚未掌握Open mv 的使用,但我们可以一起相互学习。长风破浪会有时,直挂云帆济沧海!加油!

网址推荐:

星瞳科技Open mv中文文档
星瞳科技Open mv 论坛
星瞳科技Open mv 快速上手教程

  • 31
    点赞
  • 232
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值