当前位置: 首页 > 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

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

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

相关文章:

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

相关库介绍 sensor&#xff08;摄像头&#xff09; sensor.reset() sensor.set_pixformat(sensor.RGB565) sensor.set_framesize(sensor.QVGA) sensor.skip_frames(10) reset()&#xff1a;重置并初始化单目摄像头 set_pixformat()&#xff1a;设置摄像头输出格式&#xff0c…...

【雕爷学编程】MicroPython动手做(29)——物联网之SIoT 2

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…...

chapter13:springboot与任务

Spring Boot与任务视频 1. 异步任务 使用注解 Async 开启一个异步线程任务&#xff0c; 需要在主启动类上添加注解EnableAsync开启异步配置&#xff1b; Service public class AsyncService {Asyncpublic void hello() {try {Thread.sleep(3000);} catch (InterruptedExcept…...

(十一)大数据实战——hadoop高可用之HDFS手动模式高可用

前言 本节内容我们介绍一下hadoop在手动模式下如何实现HDFS的高可用&#xff0c;HDFS的高可用功能是通过配置多个 NameNodes(Active/Standby)实现在集群中对 NameNode 的热备来解决上述问题。如果出现故障&#xff0c;如机器崩溃或机器需要升级维护&#xff0c;这时可通过此种…...

problem(3):python IDE和python解释器

为什么写这篇文章呢&#xff1f;遇到了下面的问题&#xff0c;相同的解释器&#xff0c;如果运行angr库的代码&#xff0c;会出现 这样的情况&#xff0c;但是用spyder IDE 会显示正常&#xff0c;很奇怪 应该就是IDE的原因 IDE的循环导入问题 检查IDE配置&#xff1a; 如果可…...

【C语言进阶篇】模拟实现通讯录 (内附源码)

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 &#x1f4cb; 前言一 、 通讯录的简介1.1 联系人的类型定义1.2 通讯录的定义1.3 通讯录要实现的功能 二 、 如何…...

Python web实战之 Django 的模板语言详解

关键词&#xff1a; Python、web开发、Django、模板语言 概要 作为 Python Web 开发的框架之一&#xff0c;Django 提供了一套完整的 MVC 模式&#xff0c;其中的模板语言为开发者提供了强大的渲染和控制前端的能力。本文介绍 Django 的模板语言。 1. Django 模板语言入门 Dj…...

使用ChatGPT编写技术文档

技术文档对于任何项目都是至关重要的&#xff0c;因为它确保所有利益相关者都在同一层面上&#xff0c;并允许有效的沟通和协作。创建详细而准确的技术文档可能既耗时又具有挑战性&#xff0c;特别是对于那些不熟悉主题或缺乏强大写作技巧的人来说。ChatGPT 是一个强大的人工智…...

Java超级玛丽小游戏制作过程讲解 第四天 创建并完成常量类03

今天继续来完成常量类。 package com.sxt;import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List;public class StaticValue {//背景public static Buff…...

webpack基础知识八:说说如何借助webpack来优化前端性能?

一、背景 随着前端的项目逐渐扩大&#xff0c;必然会带来的一个问题就是性能 尤其在大型复杂的项目中&#xff0c;前端业务可能因为一个小小的数据依赖&#xff0c;导致整个页面卡顿甚至奔溃 一般项目在完成后&#xff0c;会通过webpack进行打包&#xff0c;利用webpack对前…...

JAVA SE -- 第十五天

&#xff08;全部来自“韩顺平教育”&#xff09; 多线程 一、线程相关概念 1、程序&#xff1a;是为完成特定任务、用某种语言编写的一组指令的集合。 2、进程&#xff1a;是指运行中的程序&#xff0c;如QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程…...

macOS 环境变量加载探究

使用 macOS 安装环境&#xff0c;见到过很数种环境变量配置方法&#xff0c;每次也都是按照别人的代码&#xff0c;人家配置在哪 我就配置在哪&#xff0c;其实不太清楚有什么区别&#xff0c;决定记录下。 本机 macOS 13.3&#xff0c;从 macOS Catalina(10.15) 开始&#xf…...

在程序中如何判断该线程的线程id(get_id())的返回值是一个无效值

std::thread::id() 是std::thread::id的默认构造函数&#xff0c;它会创建一个空的std::thread::id对象。一个空的std::thread::id对象代表一个无效的线程标识符。 可以通过 std::thread::id 的成员函数 std::thread::id::operator() 来判断一个 std::thread::id 是否是一个空值…...

ffmpeg-ffplay代码架构简述

全局变量 /* Minimum SDL audio buffer size, in samples. */ // 最小音频缓冲 #define SDL_AUDIO_MIN_BUFFER_SIZE 512 /* Calculate actual buffer size keeping in mind not cause too frequent audio callbacks */ // 计算实际音频缓冲大小&#xff0c;并不需要太频繁…...

⛳ 多线程面试-什么是多线程上下文切换?

目录 ⛳ 多线程面试&#xff0d;什么是多线程上下文切换&#xff1f;&#x1f381; Java中用到的线程调度算法是什么&#xff1f;&#x1f3a8; 什么是线程饥饿 &#xff1f;你对线程优先级的理解是什么&#xff1f; ⛳ 多线程面试&#xff0d;什么是多线程上下文切换&#xff…...

vb+SQL车辆管理系统设计与实现

摘 要 随着信息时代的到来,信息高速公路的兴起,全球信息化进入了一个新的发展时期。人们越来越认识到计算机强大的信息模块处理功能,使之成为信息产业的基础和支柱。 我国经济的快速发展,汽车已经成为人们不可缺少的交通工具。对于拥有大量车辆的机关企事业来说,车辆的…...

java的枚举类

枚举类的概念和使用 1.枚举类的理解&#xff1a;类的对象只有有限个&#xff0c;确定的。我们称此为枚举类。 2.当需要定义一组常量时&#xff0c;强烈建议使用枚举类。对象便是所指的常量。 3.如果枚举类中只有一个对象&#xff0c;则可以作为单例模式的实现方式。 定义枚举类…...

基于java早餐店点餐系统源码设计与实现

摘 要 多姿多彩的世界带来了美好的生活&#xff0c;行业的发展也是形形色色的离不开技术的发展。作为时代进步的发展方面&#xff0c;信息技术至始至终都是成就行业发展的重要秘密。不论何种行业&#xff0c;大到国家、企业&#xff0c;小到团体、个人都在多方位的结合信息化技…...

ODOO16如何处理采购运输正常损耗的成本价核算?

《会计准则》规定&#xff1a;商品流通企业在采购商品过程中发生的运输费、装卸费、运输途中的合理损耗都归为采购存货成本中。 例如&#xff1a;采购A产品1000个&#xff0c;单价10元/个&#xff0c;途中运输正常损耗率是5%&#xff0c;因此实际入库是950个&#xff0c;入库金…...

【数据预测】基于白鲸优化算法BWO的VMD-KELM光伏发电功率预测 短期功率预测【Matlab代码#54】

文章目录 【可更换其他算法&#xff0c;获取资源请见文章第6节&#xff1a;资源获取】1. 白鲸优化算法BWO2. 变分模态分解VMD3. 核极限学习机KELM4. 部分代码展示5. 仿真结果展示6. 资源获取 【可更换其他算法&#xff0c;获取资源请见文章第6节&#xff1a;资源获取】 1. 白鲸…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

Golang——6、指针和结构体

指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...

论文阅读:Matting by Generation

今天介绍一篇关于 matting 抠图的文章&#xff0c;抠图也算是计算机视觉里面非常经典的一个任务了。从早期的经典算法到如今的深度学习算法&#xff0c;已经有很多的工作和这个任务相关。这两年 diffusion 模型很火&#xff0c;大家又开始用 diffusion 模型做各种 CV 任务了&am…...

从零开始了解数据采集(二十八)——制造业数字孪生

近年来&#xff0c;我国的工业领域正经历一场前所未有的数字化变革&#xff0c;从“双碳目标”到工业互联网平台的推广&#xff0c;国家政策和市场需求共同推动了制造业的升级。在这场变革中&#xff0c;数字孪生技术成为备受关注的关键工具&#xff0c;它不仅让企业“看见”设…...

负载均衡器》》LVS、Nginx、HAproxy 区别

虚拟主机 先4&#xff0c;后7...