K210----openMV连体学习---03.特征检测

目录

前言:

一.边缘化检测:

二.圆形识别:

三.线段识别:

四.直线识别:

五.矩形识别:

总结:


前言:

本人所用为01 studio的pyAi-K210和pyAI-OpenMV4,本人在学习完K210后,学习openMV时发现很多实验K210和openMV可以一起学习,所以写下此篇分享,本人基本都是个人笔记,非常希望有大佬提出错误和改进之处,但大佬轻喷哈!!!

----------------------------------------------------------我是分割线--------------------------------------------------------

前面我们已经学会配置摄像头了,现在我们来基于 OpenMV4 的例程,来继续学习 K210 和 OpenMV4 的有趣实验吧。

一.边缘化检测:

边缘化检测简而言之就是对一个物体的轮廓进行检测。

构造函数

【image.find_edges(edge_type[,threshold])】

边缘检测,将图像变为黑白,边缘保留白色像素。

【edge_typr】处理方式:

        image.EDGE_SIMPLE------------->简单的阈值高通滤波算法

        image.EDGE_CANNY-------------->Canny 边缘检测算法

【threshold】包含高、低阈值的二元组,默认是(100,200),仅支持灰度图像。

使用方法直接调用该函数

官方代码如下:

'''
导入 sensor 等相关模块
初始化和配置 sensor 模块
实时拍摄采集图像
边缘处理
'''

import sensor, image, time
#初始化摄像头
sensor.reset() # 初始化摄像头模块.
sensor.set_pixformat(sensor.GRAYSCALE) # 或者使用 sensor.RGB565 彩色
sensor.set_framesize(sensor.QQVGA) # 或者使用 sensor.QVGA (or others)
sensor.skip_frames(time = 2000) #延时让摄像头文稳定.
sensor.set_gainceiling(8) #设置增益,这是官方推荐的参数
clock = time.clock() # Tracks FPS.
while(True):
    clock.tick() # 用于计算 FPS(每秒帧数).
    img = sensor.snapshot() # 拍摄并返回图像.
    #使用 Canny 边缘检测器
    img.find_edges(image.EDGE_CANNY, threshold=(50, 80))
    # 也可以使用简单快速边缘检测,效果一般,配置如下
    #img.find_edges(image.EDGE_SIMPLE, threshold=(100, 255))
    print(clock.fps()) #显示 FPS(每秒帧数)



# todo 以上代码对于 K210 与 OpenMV4 均适用。

二.圆形识别:

此处运用了Hough 算法(霍夫变换):可看 http://t.csdn.cn/hhQqZ 了解基尔霍夫算法。 

圆形识别 find_circles 函数,位于 image 模块下,因此我们 直接将拍摄到的图片进行处理即可。

构造函数

image.find_circles([roi[,x_stride=2[,y_stride=1[,threshold=2000[,x_margin=10[,r_magin=10[,r_max[,r_step=2]]]]]]]]]])

        找圆函数。

        返回一个 image.circle 圆形对象,该圆形对象有4个值:

        x,y(圆心)         r(半径)       magnitude(量级);        量级越大说明识别到的圆的可信度越高。

        【roi】识别区域 (x,y,w,h) ,未指定则默认整张图片;

        【threshold】阈值。返回大于或等于 threshold 的圆,调整识别可信度;

        【x_stride】【y_stride】霍夫变换时跳过 x,y 像素的量;

        【x_margin】【y_margin】【r_margin】控制所检测圆的合并;

        【r_min】【r_max】控制识别圆形的半径范围;

        【r_step】控制识别步骤

使用方法直接调用该函数。(其中许多参数都可以使用默认值,不支持压缩图像和bayer图像)

官方代码如下:

'''
导入 sensor 等相关模块
初始化和配置 sensor 模块
实时拍摄采集图像
圆形识别并标示
'''

import sensor, image, time
#摄像头模块初始化
sensor.reset()
sensor.set_pixformat(sensor.RGB565) # 使用 grayscale 灰度图像处理速度会更快
sensor.set_framesize(sensor.QQVGA)
sensor.skip_frames(time = 2000)
clock = time.clock()
while(True):
    clock.tick()
    
    #lens_corr 为了去除畸变,1.8 是默认参数,可以根据自己实际情况调整
    img = sensor.snapshot().lens_corr(1.8)
    # 圆形类有 4 个参数值: 圆心(x, y), r (半径)和 magnitude(量级);
    # 量级越大说明识别到的圆可信度越高。
    # `threshold` 参数控制找到圆的数量,数值的提升会降低识别圆形的总数。
    # `x_margin`, `y_margin`, and `r_margin`控制检测到接近圆的合并调节.
    # r_min, r_max, and r_step 用于指定测试圆的半径范围。
    for c in img.find_circles(threshold = 2000, x_margin = 10, y_margin = 10,
 r_margin = 10,r_min = 2, r_max = 100, r_step = 2):
        #画红色圆做指示
        img.draw_circle(c.x(), c.y(), c.r(), color = (255, 0, 0))
        print(c) #打印圆形的信息
print("FPS %f" % clock.fps()) #打印 FPS(每秒采集帧数)




# todo 以上代码对 K210 和 OpenMV4 均适用

三.线段识别:

构造函数

image.find_line_segnebts([roi[,merge_distance=0[,max_theta_difference=15]]])

        【roi】识别区域(x,y,w,h),未指定则默认整张图片;

        【merge_distance】两条线段间可以相互分开而不被合并的最大像素;

        【max_theta_difference】将少于这个角度值的线段合并。

使用方法直接调用该函数即可。(大部分参数使用默认即可,但是不支持压缩图像和bayer图像哦)

官方代码如下:

'''
导入 sensor 等相关模块
初始化和配置 sensor 模块
实时拍摄采集图像
线段识别并标示
'''

enable_lens_corr = False # 打开以获得更直的线段
import sensor, image, time
#摄像头初始化
sensor.reset()
sensor.set_pixformat(sensor.RGB565) # grayscale 灰度图像处理速度更快
sensor.set_framesize(sensor.QQVGA)
sensor.skip_frames(time = 2000)
clock = time.clock()
# 所有线段对象都可以通过 `x1()`, `y1()`, `x2()`, and `y2()` 方法获取其端
# 点,当然也可以使用`line()` 获取上面 4 个值以用于 `draw_line()`画线.
while(True):
    clock.tick()
    img = sensor.snapshot()
    if enable_lens_corr: img.lens_corr(1.8) # for 2.8mm lens...
# `merge_distance` 控制相近的线段是否合并. 数值 0 (默认值)表示不合并。数值
#为 1 时候表示相近 1 像素的线段被合并。因此你可以通过改变这个参数来控制检测到线
#段的数量。
# `max_theta_diff` 控制相差一定角度的线段合并,默认是 15 度,表示 15 度内的线
# 段都会合并
    for l in img.find_line_segments(merge_distance = 0, max_theta_diff = 5):
        img.draw_line(l.line(), color = (255, 0, 0))
        print(l)    
    print("FPS %f" % clock.fps())




# todo 以上代码对K210与OpenMV4均适用

四.直线识别:

构造函数

image.find_lines[roi[,x_stride=2[,y_stride=1[,threshold=1000[,theta_margin=25[,rho_margin=25]]]]]])

        【roi】识别区域(x,y,w,h),未指定则默认整张图片;

        【threshold】阈值。返回大于或等于threshold 的直线,调整识别可信度;

        【x_stride】【y_stride】霍夫变换时跳过 x,y 像素的量;

        【theta_margin】【rho_margin】控制所检测直线的合并规则;

使用方法直接调用函数。(大部分参数使用默认即可,但是不支持压缩图像和bayer图像哦)

官方代码如下:

'''
导入 sensor 等相关模块
初始化和配置 sensor 模块
实时拍摄采集图像
直线识别并标示
'''



enable_lens_corr = False # 打开以获得更直的线段
import sensor, image, time
sensor.reset()
sensor.set_pixformat(sensor.RGB565) # grayscale is faster
sensor.set_framesize(sensor.QQVGA)
sensor.skip_frames(time = 2000)
clock = time.clock()
# 所有直线都可以通过 `theta()` 函数来获取跟水平线的夹角。
# 你也可以通过滤波算法来平滑角度.
min_degree = 0
max_degree = 179
# 所有直线对象都可以通过 `x1()`, `y1()`, `x2()`, and `y2()` 方法获取其端
#点,当然也可以使用`line()` 获取上面 4 个值以用于 `draw_line()`画线.
while(True):
    clock.tick()
    img = sensor.snapshot()
    if enable_lens_corr: img.lens_corr(1.8) # for 2.8mm lens...
    # `threshold` 参数控制找到直线的数量,数值的提升会降低识别直线的总数。
    # `theta_margin` and `rho_margin` 控制直线是否合并。若少于预设值则合并
    for l in img.find_lines(threshold = 1000, theta_margin = 25, rho_margin = 25):
#直线角度在 0 至 180 度范围内
    if (min_degree <= l.theta()) and (l.theta() <= max_degree): 
        img.draw_line(l.line(), color = (255, 0, 0))
        print(l)
    print("FPS %f" % clock.fps())
# 关于 rho 出现负数:
# [theta+0:-rho] 元组与 [theta+180:+rho]相同.



# todo 以上代码对 K210与OpenMV4均适用

五.矩形识别:

构造函数

image.find_rects([roi=Auto,threshold=10000])

        【roi】识别区域(x,y,w,h),未指定则默认整张图片;

        【threshold】阈值。返回大于或者等于 threshold 的矩形,调整识别可信度;

使用方法直接调用该函数。(大部分参数使用默认即可,不支持压缩图像和 bayer 图像哦)

官方代码如下:

'''
导入 sensor 等相关模块
初始化和配置 sensor 模块
实时拍摄采集图像
矩形识别并标示
'''
import sensor, image, time
sensor.reset()
# grayscale is faster (160x120 max on OpenMV-M7)
sensor.set_pixformat(sensor.RGB565) 
sensor.set_framesize(sensor.QQVGA)
sensor.skip_frames(time = 2000)
clock = time.clock()
while(True):
    clock.tick()
    img = sensor.snapshot()
    # `threshold` 需要设置一个比价大的值来过滤掉噪声。
    #这样在图像中检测到边缘亮度较低的矩形。矩形
    #边缘量级越大,对比越强…
    for r in img.find_rects(threshold = 10000):
        img.draw_rectangle(r.rect(), color = (255, 0, 0)) #画矩形显示
        for p in r.corners(): #四角画小圆形
            img.draw_circle(p[0], p[1], 5, color = (0, 255, 0))
        print(r)
    print("FPS %f" % clock.fps())









# todo 以上代码对 K210与OpenMV4均适用

总结:

通过以上学习,其实不难发现,用python进行检测其实很简单,其中的模块都是写好了的,我们直接用就行,列举如下:

检测类型构造函数
边缘检测image.find_edges(edge_type[, threshold])
圆形识别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_s tep=2]]]]]]]]]])
线段识别image.find_line_segments([roi[, merge_distance=0[, max_theta_diffe rence=15]]])
直线识别image.find_lines([roi[, x_stride=2[, y_stride=1[, threshold=1000[, theta_margin=25[, rho_margin=25]]]]]])
矩形识别image.find_rects([roi=Auto, threshold=10000])

OpenMV4 与 K210 中都集成了 以上构造函数,位于 image 模块下,因此 我们直接将拍摄到的图片进行处理即可。

---------------------------------------------------------------我是分割线---------------------------------------------------

此处进行说明,当前所有代码均引用官方例程,后续会陆续加入自己碰到的有意思的代码。

  • 5
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

广寒学习笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值