寻找最大的色块并且判断颜色

例程描述

识别不同颜色的色块, 只需要中心最大的那个。 识别之后做不同的处理 例如print语句/IO输出

演示效果

biggestColorBlob

源代码


# 这个历程是 识别画面中最大的色块, 并根据不同色块的颜色做出不同的反馈。
#
# Copyright (c) 2017/2017 Shunkai Xing@杭州云江科技 <xingshunkai@qq.com>
# This work is licensed under the MIT license, see the file LICENSE for details.
# 获取更多OpenMV相关教程,加QQ群 凡哥带你玩转OpenMV < 564048763 >

import sensor, image, time


# 下面的阈值, 可能需要大家手动调节
thresholds = [(45, 65, 40, 80, 40, 60), # 一般情况下的红色阈值
              (45, 65, -50, -30, 0, 40), # 一般情况下的绿色阈值
              (45, 65, -20, 30, -60, -20)] # 一般情况下的蓝色阈值

sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time = 2000)
sensor.set_auto_gain(False) # must be turned off for color tracking
sensor.set_auto_whitebal(False) # must be turned off for color tracking
clock = time.clock()

# 绘制实心圆 - 只是为了好看
def drawFullFillCircle(img, x, y, r, color):
    # 一圈一圈填实
    for ri in range(1, r + 1):
        img.draw_circle(x, y, ri, color = color)

# 标记当前识别的颜色
def markCurColor(img, cName, cRgb):
    img.draw_string(0, 0, cName, color = cRgb)
    drawFullFillCircle(img, 40, 40, 20, cRgb)

# 如果是红色,执行此函数
def doWithRed(img):
    markCurColor(img, "RED", (255, 0, 0))

# 如果是绿色,执行此函数
def doWithGreen(img):
    markCurColor(img, "GREEN", (0, 255, 0))

# 如果是绿色,执行此函数
def doWithBlue(img):
    markCurColor(img, "BLUE", (0, 0, 255))


# 颜色代码与所对应需要执行函数的映射
colorCodeMapFunc = {
    1: doWithRed,
    2: doWithGreen,
    4: doWithBlue
}


# 比较两个色块大小的函数
def compareBlob(blob1, blob2):
    # 这里我们选择了pixels作为指标比对二者的代码
    # 你也可以换用其它指标 例如 blob.area()
    tmp = blob1.pixels() - blob2.pixels()
    if tmp == 0:
        return 0;
    elif tmp > 0:
        return 1;
    else:
        return -1;

while(True):
    clock.tick()
    bigBlob = None #最大的色块
    img = sensor.snapshot()

    blobs = img.find_blobs( thresholds, pixels_threshold=200, area_threshold=200, merge=True)

    # 判断是否有色块检测到
    if len(blobs) == 0:
        continue

    bigBlob = blobs[0]
    for blob in blobs:
        # 如果此色块比最大的色块还大
        if compareBlob(bigBlob, blob) == -1:
            bigBlob = blob

        # 标注其他色块
        img.draw_rectangle(blob.rect())

    # 标记识别到的最大色块
    img.draw_circle(bigBlob.cx(), bigBlob.cy(), int( bigBlob.w() / 2 ), color = (0, 0, 0))
    img.draw_cross(bigBlob.cx(), bigBlob.cy())
    # 根据最大色块的颜色调用不同的函数

    # 如果color代码为颜色阈值其中的一个(而不是多个阈值条件都满足)
    if bigBlob.code() in colorCodeMapFunc:
        colorCodeMapFunc[bigBlob.code()](img)
    else:
        print("code not match" + str(bigBlob.code()))

    print(clock.fps())
Copyright 杭州云江科技有限公司 2017 all right reserved,powered by Gitbook该文件修订时间: 2019-04-06 01:18:49

results matching ""

    No results matching ""