文章目录
- 前言
- 带着问题来看
- 一、函数
- 二、使用方法
- 1.img.find_circles
- 2.img.find_rects
- 3.find.line_segments
- 三、摄像情况及终端结果
- 1.img.find_circles
- 2.img.find_rects
- 3.find.line_segments
- 写在最后
前言
本博客是第一次新路尝试,主要内容在于说说一些个人心得。如果能够帮到读者或者给到一点启发,不胜荣幸!如若有瑕疵还希望得到中肯的意见。谢谢,鞠躬。
本人是一名刚上大四的初学者,目前有些关于Open mv一些个人的见解,在这个平台与大家分享。
带着问题来看
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 的使用,但我们可以一起相互学习。长风破浪会有时,直挂云帆济沧海!加油!