K210学习笔记(九)——色块识别

前言

第一次接触寻找色块,也就是颜色识别是在上一届工程训练赛看到学长们的小车用openmv实现的,当初觉得很不可思议,一直有一个疑问,它是怎么实现颜色识别的呢?经过多MAIX BIT(K210)一段时间的接触,终于对色块识别有了初步的认识。

MAIX BIT(K210)是由openmv魔改而来,所以在有些使用方法上是一样的,比如色块识别。openmv的色块识别可以看这里

一、阈值

1.结构

一个颜色阈值的结构是这样的:

red = (minL, maxL, minA, maxA, minB, maxB)

元组里面的数值分别是L A B 的最大值和最小值。

2.IDE指定识别颜色

1、
在IED中打开阈值编辑器
在这里插入图片描述
2、选择颜色图片来源
在这里插入图片描述
选择帧缓冲区需要实现运行IDE并将想要识别的颜色保持在缓冲区中
在这里插入图片描述
图像文件只需要打开想要识别颜色的图片,比如
在这里插入图片描述
然后调节跟踪阈值,将想要识别的颜色调整为高亮(白色),之后出现的阈值就是我们想要识别颜色的阈值,复制即可。
在这里插入图片描述

二、构造函数

1.find_blobs函数

通过find_blobs函数可以找到色块

image.find_blobs(thresholds, roi=Auto, x_stride=2, y_stride=1, invert=False, area_threshold=10, pixels_threshold=10, merge=False, margin=0, threshold_cb=None, merge_cb=None)

参数说明:
thresholds是颜色的阈值,注意:这个参数是一个列表,可以包含多个颜色。如果你只需要一个颜色,那么在这个列表中只需要有一个颜色值,如果你想要多个颜色阈值,那这个列表就需要多个颜色阈值。注意:在返回的色块对象blob可以调用code方法,来判断是什么颜色的色块。
例如:

red = (xxx,xxx,xxx,xxx,xxx,xxx)
blue = (xxx,xxx,xxx,xxx,xxx,xxx)
yellow = (xxx,xxx,xxx,xxx,xxx,xxx)

img=sensor.snapshot()
red_blobs = img.find_blobs([red])

color_blobs = img.find_blobs([red,blue, yellow])

roi是“感兴趣区”。详情可以看这里
例如:

left_roi = [0,0,160,240]
blobs = img.find_blobs([red],roi=left_roi)

x_stride 就是查找的色块的x方向上最小宽度的像素,默认为2,如果你只想查找宽度10个像素以上的色块,那么就设置这个参数为10:

blobs = img.find_blobs([red],x_stride=10

y_stride 就是查找的色块的y方向上最小宽度的像素,默认为1,如果你只想查找宽度5个像素以上的色块,那么就设置这个参数为5:

blobs = img.find_blobs([red],y_stride=5)

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

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

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

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

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

red_blobs = img.find_blobs([red],merge=True)
blue_blobs = img.find_blobs([blue],merge=True)
yellow_blobs = img.find_blobs([yellow],merge=True)

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

2.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()是圆的外接正方形的面积。

三、使用方法

MaixPy 已经在 image 模块中实现有查找色块方法,需要使用非 minimum 固件版本。点击这里下载

1.识别绿色

例程:

#初始化
import sensor
import image
import lcd
import time
lcd.init()
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.run(1)
green_threshold   = (70, 46, -128, 127, -128, 127)
while True:
    img=sensor.snapshot()
    blobs = img.find_blobs([green_threshold])
    if blobs:
        for b in blobs:
            tmp=img.draw_rectangle(b[0:4])##在图像上绘制一个矩形。
            tmp=img.draw_cross(b[5], b[6])##画十字交叉            
    lcd.display(img)

运行效果:

maix bit颜色识别

总结

MAIX BIT(K210)的色块识别和openmv的使用方法是非常类似的,大部分的代码都可以直接用。

  • 28
    点赞
  • 234
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
你好!感谢提问。下面是有关 K210 学习笔记五中串口通信的一些内容: 在 K210 开发板上,串口是一种常见的通信接口,用于将数据从一个设备传输到另一个设备。串口通信通常使用 UART (Universal Asynchronous Receiver/Transmitter) 协议。 要在 K210 上进行串口通信,首先需要使用两个引脚:一个用于接收数据(RX),一个用于发送数据(TX)。这些引脚可以通过 GPIO 端口与外部设备连接。 在 K210 的开发环境中,可以使用 MaixPy 或者 Kendryte Standalone SDK 进行串口编程。 在 MaixPy 中,可以使用 `uart` 模块来进行串口通信。例如,要初始化一个串口对象并设置波特率为 115200,可以使用以下代码: ```python from machine import UART uart = UART(UART.UART1, 115200) ``` 然后,可以使用 `uart.write()` 函数发送数据,使用 `uart.read()` 函数接收数据。例如: ```python uart.write("Hello, world!\n") data = uart.read(10) ``` 在 Kendryte Standalone SDK 中,可以使用 `uart.h` 头文件中的函数来进行串口通信。例如,要初始化一个串口对象并设置波特率为 115200,可以使用以下代码: ```c #include "uart.h" uart_init(UART_DEVICE_1, 115200); ``` 然后,可以使用 `uart_send_data()` 函数发送数据,使用 `uart_receive_data()` 函数接收数据。例如: ```c uart_send_data(UART_DEVICE_1, "Hello, world!\n", 14); char buffer[10]; uart_receive_data(UART_DEVICE_1, buffer, 10); ``` 以上是关于 K210 学习笔记五中串口通信的简要介绍。如果你有更具体的问题,请随时提问!
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值