博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
K210实现多色块检测功能
阅读量:3958 次
发布时间:2019-05-24

本文共 3960 字,大约阅读时间需要 13 分钟。

在这里插入图片描述

1 方案思路

颜色阈值检测

要实现的是多色检测,我选择的是黄色和红色,要通过阈值管理器先定义这俩颜色对应的阈值

yellow_threshold   = (49, 100, 26, -18, 2, 72)#括号里面是颜色阈值red_threshold     = (26, 84, 85, 26, -33, 73)

注意:识别颜色的时候一定要关闭白平衡

图像识别函数

roi为感兴趣区域

x_stride 就是查找的色块的x方向上最小宽度的像素,默认为2

y_stride 就是查找的色块的y方向上最小宽度的像素,默认为1

invert 反转阈值,把阈值以外的颜色作为阈值进行查找

area_threshold 面积阈值,如果色块被框起来的面积小于这个值,会被过滤掉

pixels_threshold 像素个数阈值,如果色块像素数量小于这个值,会被过滤掉

merge 合并,如果设置为True,那么合并所有重叠的blob为一个。

注意:这会合并所有的blob,无论是什么颜色的。如果你想混淆多种颜色的blob,只需要分别调用不同颜色阈值的find_blobs。

margin 边界,如果设置为1,那么两个blobs如果间距1一个像素点,也会被合并

blob有多个方法:

blob.rect() 返回这个色块的外框——矩形元组(x, y, w, h),可以直接在image.draw_rectangle中使用。

blob.x() 返回色块的外框的x坐标(int),也可以通过blob[0]来获取。

blob.y() 返回色块的外框的y坐标(int),也可以通过blob[1]来获取。

blob.w() 返回色块的外框的宽度w(int),也可以通过blob[2]来获取。

blob.h() 返回色块的外框的高度h(int),也可以通过blob[3]来获取。

blob.pixels() 返回色块的像素数量(int),也可以通过blob[4]来获取。

blob.cx() 返回色块的外框的中心x坐标(int),也可以通过blob[5]来获取。

blob.cy() 返回色块的外框的中心y坐标(int),也可以通过blob[6]来获取。

blob.rotation() 返回色块的旋转角度(单位为弧度)(float)。如果色块类似一个铅笔,那么这个值为0180°。如果色块是一个圆,那么这个值是无用的。如果色块完全没有对称性,那么你会得到0360°,也可以通过blob[7]来获取。

blob.code() 返回一个16bit数字,每一个bit会对应每一个阈值。举个例子:

blobs = img.find_blobs([red, blue, yellow], merge=True)

如果这个色块是黄色,那么它的code就是0001,如果是红色,那么它的code就是0010。注意:一个blob可能是合并的,如果是红色和蓝色的blob,那么这个blob就是0011。这个功能可以用于查找颜色代码。也可以通过blob[8]来获取。

blob.count() 如果merge=True,那么就会有多个blob被合并到一个blob,这个函数返回的就是这个的数量。如果merge=False,那么返回值总是1。也可以通过blob[9]来获取。

blob.area() 返回色块的外框的面积。应该等于(w * h)

blob.density() 返回色块的密度。这等于色块的像素数除以外框的区域。如果密度较低,那么说明目标锁定的不是很好。

比如,识别一个红色的圆,返回的blob.pixels()是目标圆的像素点数,blob.area()是圆的外接正方形的面积

blobs = img.find_blobs([green_threshold,red_threshold],pixels_threshold = 24,area_threshold = 5,merge = True)

这里我们选择两种颜色,所以需要拼接这两个阈值,使用pixels和area综合来过滤掉细小的像素识别。

然后画出矩形,采用上面的blobs方法可以获取到矩形的中心坐标cx,cy

2 代码

import sensor, image,time,lcd,utimeyellow_threshold   = (70, 100, -8, 31, -23, 12)#括号里面是颜色阈值red_threshold     =(25, 89, 30, 87, -41, 52)#摄像头初始化sensor.reset()sensor.set_pixformat(sensor.RGB565)sensor.set_framesize(sensor.QVGA)sensor.set_vflip(1)   #后置拍摄模式sensor.skip_frames(10) # Let new settings take affect.sensor.set_auto_whitebal(False) # 白平衡关闭#sensor.snapshot(1.8)#去鱼眼化#LCD初始化lcd.init()clock = time.clock() # Tracks FPS.img = sensor.snapshot()K=5000#the value should be measured K=length*Lm # 实际的大小=K2*直径的像素K2=10.5/101#QQVGA模式下K2=10.5/139  #QVGA模式下K2=10.5/279#blobs = img.find_blobs([yellow_threshold], x_stride=5, y_stride=5, invert=False, area_threshold=10, pixels_threshold=25, merge=False, margin=0, threshold_cb=None, merge_cb=None)#调用颜色阈值while(True):    clock.tick() # Track elapsed milliseconds between snapshots().    img = sensor.snapshot() # Take a picture and return the image.    #lcd.display(img)#lcd屏幕显示    blobs = img.find_blobs([yellow_threshold,red_threshold],pixels_threshold = 400,area_threshold = 200,margin=5,merge = False)    if blobs:    #如果找到了目标颜色        for b in blobs: #循环效果不好,会有很多误识别,采用单个矩形采样方便返回坐标        #迭代找到的目标颜色区域            x = b[0]            y = b[1]            width = b[2]            height = b[3]                # Draw a rect around the blob.            img.draw_rectangle([x,y,width,height]) # rect                #用矩形标记出目标颜色区域            img.draw_cross(b[5], b[6]) # cx, cy                #在目标颜色区域的中心画十字形标记            Lm = (b[2]+b[3])/2 #b[2]色块的外框的宽 ,b[3]色块的外框的高            pixels=b[4]#色块的像素数量            length = K/Lm        #print(length)#长度27        #print(Lm)#像素点            size=K2*Lm            print(size)#色块的外框的平均直径            K3=13/140            b2=K3*b[2]            b3=K3*b[3]            K4=17.74*12.9/24846            area=pixels*K4#物体的面积            ratio=pixels/76241*100#76241为摄像头检测出来的像素点个数            img.draw_string(x,y, "area=")#写面积            img.draw_string(x+40, y, str(area))#写面积            img.draw_string(x,y+10, "pixels=")#像素点            img.draw_string(x+40, y+10, str(pixels))#写像素点。            img.draw_string(x,y+20, "pixel ratio=")#像素占比            img.draw_string(x+60, y+20, str(ratio))#像素占比            #utime.sleep(2) #延时2秒            lcd.display(img)#lcd屏幕显示

转载地址:http://zxtzi.baihongyu.com/

你可能感兴趣的文章
hdu——1106排序(重定向)
查看>>
hdu——1556Color the ball(树状数组)
查看>>
hdu——1541Stars(树状数组)
查看>>
快速幂的精简代码
查看>>
求大数乘方的前n位数字(对数加快速幂)
查看>>
hdu——2602Bone Collector(第一类背包问题)
查看>>
hdu——1711Number Sequence(kmp专练)
查看>>
strstr函数和find函数的异同
查看>>
Java的反射
查看>>
HTTP请求之POST与GET区别
查看>>
SSM结合Redis
查看>>
优化数据库的八种方法
查看>>
Java Web服务收到请求时线程的情况以及session情况
查看>>
SSM配置文件信息加密实现
查看>>
@Produces注解
查看>>
谈谈序列化—实体bean一定要实现Serializable接口?
查看>>
实用小技巧之电脑如何滚动截屏/截取长图
查看>>
Eclipse离线安装Java Decompiler插件
查看>>
Http预请求options
查看>>
未来设计师的工作模式?从室内设计领域的实时设计说起 | Mixlab趋势
查看>>