一种基于open mv的自适应阈值的方法

您所在的位置:网站首页 threshold怎么读的 一种基于open mv的自适应阈值的方法

一种基于open mv的自适应阈值的方法

2023-10-02 09:22| 来源: 网络整理| 查看: 265

提示:本程序测试主控为open mv4 H7,开发平台为openmv IDE,在mv3型号的摄像头也可适用,只是帧相对不高,一块自制按键板,使用了一块LCD液晶扩展版,测试看效果不需要用

目录

前言介绍

一、openmv IDE配置

1.引入调用

2.引入变量和定义

3.常规配置

4.提升辨识效果的小方法

5.循环函数

6.通过电平变化更改阈值

7.追踪目标颜色 

 二 . 实际效果演示

 三 . 程序链接下载 

总结

前言介绍

本篇介绍一种基于openmv的自适应取阈值的方法,在我们实际使用中,openmv受环境光影响较大,有可能提前设置好的阈值并不适合实际比赛或者应用场地,而且如果遇到混合颜色或者极端情况提前取好的阈值可能失效,增加阈值数目又可能会出现颜色混淆,所以我设计出这种自适应阈值的取阈值方式,程序初始没有设置准确的阈值,通过将想要追踪的颜色或者混合颜色目标对准摄像头中间绘出小框,再通过按键等对P1口施加高电平,摄像头即可自动追踪目标颜色,可以根据条件一键追踪目标,一般和外接的LCD屏连用用于比赛或实际工作场地调节,无需再连接到电脑手动调节阈值,适合比赛准备或者抗光干扰实验研究

提示:以下是本篇文章正文内容,下面案例可供参考

一、openmv IDE配置

1.首先先引入调用

这里主要引入lcd(液晶屏)和pin(引脚)

import sensor, image, time, math, json, pyb,lcd from pyb import LED from pyb import Pin

2.引入变量和定义

将P1口设置为输入模式,并且电平拉高,其它口也可以,但注意看引脚,不要和lcd口冲突,定义6个变量并存入一个阈值的L,A,B三色中,以便后续覆盖更改阈值

pin0 = Pin('P1', Pin.IN, Pin.PULL_UP) blue_L_min=1 blue_L_max=1 blue_A_min=1 blue_A_max=1 blue_B_min=1 blue_B_max=1 Lmin = 1 Lmax = 1 Amin = 1 Amax = 1 Bmin = 1 Bmax = 1 # 颜色跟踪阈值(L Min, L Max, A Min, A Max, B Min, B Max) thresholds1 =[ (blue_L_min,blue_L_max,blue_A_min,blue_A_max,blue_B_min,blue_B_max) ]

3.常规配置

初始化一些基本设置,注意图像格式一般使用QVGA或者QQVGA,由于液晶扩展版屏幕较小,无法完全显示,所以只能看到中心一部分的区域,如果想要完全显示,可以将像素的点改为QVGA2,但此时摄像头视野有限。

roi的格式是(x, y, w, h)的tupple.用于选取感性区域

x:ROI区域中左上角的x坐标y:ROI区域中左上角的y坐标w:ROI的宽度h:ROI的高度 ensor.reset() #初始化摄像头,reset()是sensor模块里面的函数 sensor.set_pixformat(sensor.RGB565) #设置图像色彩格式,有RGB565色彩图和GRAYSCALE灰度图两种 sensor.set_framesize(sensor.QVGA) lcd.init() # 初始化lcd屏幕。 #设置图像像素大小 sensor.skip_frames(time = 2000) #sensor.set_vflip(True) #sensor.set_hmirror(True) sensor.set_contrast(0) sensor.set_auto_gain(False) # 颜色跟踪必须关闭自动增益 sensor.set_auto_whitebal(False) # 颜色跟踪必须关闭白平衡 clock = time.clock() ROI=(140,100,20,20)

4.提升辨识效果的小方法

这里引入一个求图像中最大的图像的方法,如果我们所要追踪的图像只有一个,使用此函数可以追踪最大的色块,用这个函数将大幅度提示辨识效率

def find_max(blobs): max_size=0 for blob in blobs: if blob.pixels() > max_size: max_blob = blob max_size = blob.pixels() return max_blob

5.循环函数

这里运用的openmv统计方法,拍摄一张图片,将图像中roi感性区域提取出来并赋值给变量statisics,statistics.mode() 返回灰度的众数(0-255) (int)。你也可以通过statistics[2]获得,color_l,

color_a,color_b,分别接收3个颜色的众数,但彩色图有颜色最大最小值,所以我们将3个值分别+-10获得6个阈值,并存入参数中,此时就得到的目标区域的颜色阈值,如果效果不佳,可用更改最大最小值的范围或者,如果目标颜色是混合颜色,可以使用平均数提升效果

 img.draw_rectangle(ROI)将感性区域框出来

while(True): clock.tick() img = sensor.snapshot() statistics=img.get_statistics(roi=ROI) color_l=statistics.l_mode() color_a=statistics.a_mode() color_b=statistics.b_mode() print(color_l,color_a,color_b) img.draw_rectangle(ROI) Lmin = color_l - 10 Lmax = color_l + 10 Amin = color_a - 10 Amax = color_a + 10 Bmin = color_b - 10 Bmax = color_b + 10

如果是 img.get_statistics((0,0,10,20)),ROI不会起作用。

statistics.mean() 返回灰度的平均数(0-255) (int)。你也可以通过statistics[0]获得。

statistics.median() 返回灰度的中位数(0-255) (int)。你也可以通过statistics[1]获得。

statistics.mode() 返回灰度的众数(0-255) (int)。你也可以通过statistics[2]获得。

statistics.stdev() 返回灰度的标准差(0-255) (int)。你也可以通过statistics[3]获得。

statistics.min() 返回灰度的最小值(0-255) (int)。你也可以通过statistics[4]获得。

statistics.max() 返回灰度的最大值(0-255) (int)。你也可以通过statistics[5]获得。

statistics.lq() 返回灰度的第一四分数(0-255) (int)。你也可以通过statistics[6]获得。

statistics.uq() 返回灰度的第三四分数(0-255) (int)。你也可以通过statistics[7]获得。

6.通过电平变化更改阈值

默认下引脚电平为高电平,当通过按键对IO口1施加低电平时,开始将新的阈值覆盖给数组,从而实现阈值的自动更替,同时打印出得出的目标阈值参数方便核查数据,LED灯光变化可放映设置是否成功和程序是否正常运行

key0 = pin0.value() print(key0) if key0 == 0: LED(3).on() LED(1).off() blue_L_min = Lmin blue_L_max = Lmax blue_A_min = Amin blue_A_max = Amax blue_B_min = Bmin blue_B_max = Bmax print(blue_L_min,blue_L_max,blue_A_min,blue_A_max,blue_B_min,blue_B_max) thresholds1 = [(blue_L_min,blue_L_max,blue_A_min,blue_A_max,blue_B_min,blue_B_max)] if key0 == 1: LED(1).on() LED(3).on()

这里要注意pin0.value()的使用,可以用这个函数获取或者更改电平

7.追踪目标颜色

拍一张照片,寻找这种颜色,如果找到,则通过调用之前的find_max函数寻找到最大的色块,再将目标颜色用矩形框和中心十字框出来,我用的是蓝色,也可以更改color的值来选定

 

blobs = img.find_blobs(thresholds1,roi=left_roi,pixels_threshold=50, area_threshold=50,merge = True) if blobs: #a5,a6,string6,string7,string8 max_blob1 = find_max(blobs) img.draw_edges(max_blob1.min_corners(), color=(0,0,255)) img.draw_cross(max_blob1[5], max_blob1[6],color=(0,0,255)) output_str="(%3d%3d)" % (max_blob1[5],max_blob1[6]) #方式1 # 只有比“pixel_threshold”多的像素和多于“area_threshold”的区域才被 # 下面的“find_blobs”返回。 如果更改相机分辨率, # 请更改“pixels_threshold”和“area_threshold”。 “merge = True”合并图像中所有重叠的色块。

最后记得通过此函数将图像导入到外接的LCD屏上,这样就实现了无需软件电脑实时调节阈值的功能

lcd.display(img) # 拍照并显示图像。

二、 实际效果演示

这里使用openmH4摄像头,一个液晶屏(可选),一个自制的按键用于输入高低电平变化

 

 

这是在openmvIDE上看到的效果,如图可见将想要追踪的颜色对中心矩形框,给予P1口电平变化,就能自动识别找出目标颜色的图像,效果明显,无需提前设置阈值

这是在液晶扩展版上的图像,可用于脱机测试和实时自动调节阈值,下图就是脱机运行调节阈值

对混合颜色追踪和复杂颜色情况颜色追踪效果非常明显,可用无视目标体积和干扰颜色的影响,更改前面提及的色差和平均值可以提高辨识效果

三.程序链接下载

https://download.csdn.net/download/weixin_44984773/20298516?spm=1001.2014.3001.5501

总结

在比赛准备中,我发现目前很多场景或者试题都用到了视觉处理,openmv是一个很好的处理部件,环境中的光干扰或者我们实际测试与目标场的的一些颜色色差变化很有可能干扰我们的效果,提前取的固定阈值并不一定适合复杂多种情况,通过这种自适应阈值调节方法,为解决这个问题提供一种解决方案,此方案并不完美,后续我将进行修改,增加flash掉电存储功能还要能调整选框大小,以适应多种情况,为8月份的比赛做更足的准备,有不足之处,还望各位大佬包涵指正。



【本文地址】


今日新闻


推荐新闻


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