当前位置: 首页 > news >正文

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

相关库介绍

sensor(摄像头)

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

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

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

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

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

代码介绍

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

矩形阈值设定

 图1 选择阈值编辑器

  图2 阈值调节框

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

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

  图3 阈值调节结果

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

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

关键代码

    # 寻找轮廓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)表示色块的中心点。

def find_min(blobs):use_ = [20,20, 280,200]max_size = float("inf")min_blob = Nonefor 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 = blobmin_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

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

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

http://www.lryc.cn/news/111494.html

相关文章:

  • 【雕爷学编程】MicroPython动手做(29)——物联网之SIoT 2
  • chapter13:springboot与任务
  • (十一)大数据实战——hadoop高可用之HDFS手动模式高可用
  • problem(3):python IDE和python解释器
  • 【C语言进阶篇】模拟实现通讯录 (内附源码)
  • Python web实战之 Django 的模板语言详解
  • 使用ChatGPT编写技术文档
  • Java超级玛丽小游戏制作过程讲解 第四天 创建并完成常量类03
  • webpack基础知识八:说说如何借助webpack来优化前端性能?
  • JAVA SE -- 第十五天
  • macOS 环境变量加载探究
  • 在程序中如何判断该线程的线程id(get_id())的返回值是一个无效值
  • ffmpeg-ffplay代码架构简述
  • ⛳ 多线程面试-什么是多线程上下文切换?
  • vb+SQL车辆管理系统设计与实现
  • java的枚举类
  • 基于java早餐店点餐系统源码设计与实现
  • ODOO16如何处理采购运输正常损耗的成本价核算?
  • 【数据预测】基于白鲸优化算法BWO的VMD-KELM光伏发电功率预测 短期功率预测【Matlab代码#54】
  • 函数式编程-将过程作为返回值的应用:分步过程
  • Mysql-学习笔记
  • 【雕爷学编程】Arduino动手做(187)---1.3寸OLED液晶屏模块2
  • Windows用户如何安装新版本cpolar内网穿透
  • MacBookPro安装Win10,Wifi不能用了,触控板不能用了(2)
  • 理解C++中变量的作用域
  • vue+element-ui给全局请求设置一个loading样式
  • 传球游戏
  • 智能卡通用安全检测指南 思度文库
  • Maven设置阿里云路径(防止加载过慢)
  • JavaScript原型链污染漏洞复现与防范