K210实现多色块检测功能

K210实现多色块检测功能_第1张图片

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,utime
yellow_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屏幕显示

你可能感兴趣的:(图像识别-K210,opencv,计算机视觉,图像识别)