2023 电赛 E 题 K210 方案--K210实现矩形识别

相关库介绍

sensor(摄像头)

sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(10)

reset():重置并初始化单目摄像头

set_pixformat():设置摄像头输出格式,可选的帧格式有**GRAYSCALE, RGB565, YUV422,需要根据自己的摄像头进行修改**

**set_framesize():**设置摄像头输出帧大小,最大支持VGA格式,推荐设置为QVGA格式

skip_frames():跳过指定帧数或者跳过指定时间内的图像,主要作用为让摄像头识别的图像稳定下来,画面不抖动

代码介绍

识别的具体思路可以看2023 电赛 E 题 K210方案 第五章

矩形阈值设定

图1 选择阈值编辑器

图2 阈值调节框

通过调节LAB值来得到让图中矩形框为白或为黑。

得到LAB阈值:(73, 16, -67, 30, 55, -56)

图3 阈值调节结果

注:在实际情况中,这个阈值需要进行调整,在不同环境因素下,即使在同一个地方,由于不同的距离和光线,都会影响阈值的最终结果。

建议:在进行阈值设定时,可以多考虑不同的情况下,不同的阈值情况,让代码选择在不同的情况下的不同阈值;或则收集到足够多的阈值,使用聚类方法将其得到一个中间值。

关键代码

python 复制代码
    # 寻找轮廓
    contours = img.find_blobs(region_thresholds1[i], invert=False, area_threshold=100, pixels_threshold=10, merge=True)
    if contours:
        max_blob = find_min(contours)
        if max_blob:
            img.draw_rectangle(max_blob[0:4], color=(0,255,0))

find_blobs():查找图像中所有色块,并返回一个包括每个色块的色块对象的列表。

thresholds: 必须是元组列表. [(minL, minA, minB, maxL, maxA, maxB)],就是阈值

invert:反转阈值操作,像素在已知颜色范围之外进行匹配,而非在已知颜色范围内。

即:在调节的阈值中需要的为黑色,通过反转后,就会检测白色部分,返回白色部分的色块。

area_threshold:若一个色块的边界框区域小于该值,则会被过滤掉。

pixels_threshold:若一个色块的像素数小于该值,则会被过滤掉。

merge :True,则合并所有没有被过滤掉的色块,这些色块的边界矩形互相交错重叠。

通过调用该方法就可以找到在画面中所需要的所有结果。

返回值:[{'x': 140, 'y': 88, 'w': 15, 'h': 7, 'pixels': 43, 'cx': 147, 'cy': 91}]

(x, y, w, h)表示色块的外框,pixels表示色块的像素大小,(cx, cy)表示色块的中心点。

python 复制代码
def find_min(blobs):
    use_ = [20,20, 280,200]
    max_size = float("inf")
    min_blob = None
    for blob in blobs:
        if blob[0] != 0 and blob[1] != 0:
            if is_rect_in_rect(use_, blob[0:4]) or abs(abs(blob[0] - blob[2]) - abs(blob[1] - blob[3])) < max_size:
                print(blob)
                min_blob = blob
                min_size = abs(abs(blob[0] - blob[2]) - abs(blob[1] - blob[3]))
    return min_blob

find_min():该函数的作用时从得到的矩形框中选出我们需要的,剔除掉不合适的。

在这个函数里面我们限定识别到的矩形框应该在整个画面的中心位置,不能出现在画面的边界位置。

并且我们还去掉了一种特殊情况,就是当摄像头什么都没有识别到或识别画面为空(显示为黑色)时,就会把整个画面进行框起来,这种是一种特殊情况,在代码中通过判断矩形的起始坐标是否w为0,如果为0,就去掉该种情况。

出现的问题

1、当画面距离摄像头太远时,识别的效果会不佳。

2、在移动过程中,会出现识别不佳。

3、画面模糊。

4、代码频频报错,不知道什么原因。

解决的问题

1、可以等摄像头稳定时,看看它的识别效果怎样,尽量不要用手去移动,可以使用一个支架。

2、在移动过程中,可以考虑给摄像头加一个跳帧识别,或则选用一个高性能的摄像头。

3、这个可能时在初始化摄像头时没有设置对,或则摄像头已经损坏。

4、K210中使用的Python语言并不是一个完整的Python,简称MicroPython,与Python是有区别的,因此在编写代码中要额外注意,不能混淆两则。如果语法正确,那就可能是当前安装的固件中不支持当前代码的库,这样就需要去更新固件。

实现效果

图4 识别效果1

图5 识别效果2

下一章内容:对当前代码进行修改和完善,使其在远距离也能够进行识别。

硬性的标准其实限制不了无限可能的我们,所以啊!少年们加油吧!

相关推荐
7yewh22 天前
【K230 CanMV】图像识别-摄像头获取图像 Sensor 函数全解析
ai·图像识别·soc·k210·嵌入式软件·mipi·k230
画凉ZL5 个月前
视觉巡线小车(STM32+OpenMV)——总结
stm32·电赛·小车·openmv·视觉巡线
自陈6 个月前
基于Openmv的追小球的云台
电赛·图像识别·openmv
CatShitK6 个月前
基 CanMV 的 C 开发环境搭建(Linux,Ubuntu篇)
linux·c语言·开发语言·数据结构·stm32·ubuntu·k210
DTcode77 个月前
电赛之路:历年试题剖析、实战经验分享与代码资源宝典
电赛·竞赛·电子设计·电子与信息技术
小光学嵌入式7 个月前
电赛经验分享——赛前准备
经验分享·电赛
小白学arduino7 个月前
齐护K210系列教程(二十七)_语音识别
人工智能·语音识别·k210·micropython·图形化编程
我先去打把游戏先10 个月前
K210基础实验——点亮LED灯
c语言·c++·stm32·单片机·嵌入式硬件·学习·k210
懂IT的嵌入式工程师1 年前
01. k210-命令行环境搭建(ubuntu环境)
k210·k210环境搭建
三马分享家1 年前
K210 UART串口通信介绍与 STM32通信
stm32·单片机·嵌入式硬件·k210