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

K210视觉识别模块学习笔记3:内存卡写入拍摄图片_LED三色灯的操作_按键操作_定时器的配置使用

今日开始学习K210视觉识别模块:

LED三色灯的操作_按键操作_定时器的配置使用_内存卡写入拍摄图片

亚博智能的K210视觉识别模块......  

固件库版本:  canmv_yahboom_v2.1.1.bin

本文最终目的是编写一个按键拍照的例程序:

为以后的专用场景的模型训练做准备,因为训练自己的模型需要大量的图片,并人工标注

图片的来源最好是K210自己拍摄的,(其他设备拍也行):

我个人认为这样训练出的模型会更贴合K210自身的实际识别场景,并且基础像素不会太高(现在手机像素动不动就破一亿,会给简单的识别运算增加负担)

文章提供测试代码讲解、完整代码贴出、测试效果图

目录

LED三色灯的操作使用:

代码测试效果:

按键的操作使用:

代码测试效果:

定时器定时中断的配置使用:

定时器配置相关函数介绍:

编写例程序:

代码测试效果:

按键写入照片到TF内存卡:

本部分实现功能:

代码编写:

代码测试结果:


LED三色灯的操作使用:

本段实验目的:

开启LED三色显示 使用系统延时......

LED每隔一秒切换颜色点亮,并用串口打印当前点亮颜色情况

该例程序告诉我们如何import RGB三色灯的库头文件以及每个颜色灯的设置参数:

time.sleep(1)表示 系统延时一秒:

from modules import ybrgb
import time
RGB = ybrgb() #RGB = ybrgb()能够成功创建一个RGB LED控制对象while True:
#RGB.set(r, g, b)函数能够正确接收三个参数(红色、绿色、蓝色的亮度值,范围通常是0-255),并控制RGB LED灯的颜色。RGB.set(1, 0, 0)print("RED")time.sleep(1)RGB.set(0, 1, 0)print("GREEN")time.sleep(1)RGB.set(0, 0, 1)print("BLUE")time.sleep(1)RGB.set(1, 1, 1)print("WHITE")time.sleep(1)RGB.set(0, 0, 0)print("BLack")time.sleep(1)

代码测试效果:

该段代码可以直接放在IDE中进行测试:效果就是每个一秒进行LED循环切换显示颜色:

红、绿、蓝、白、灭,并且串口同步发送当前颜色显示情况:

按键的操作使用:

本段实验目的:

按下一次按键后串口就打印一次提示

以下代码展示了如何调用KEY的使用方法:

(与官方例程略有不同,添加了等待按键松开的循环)

from modules import ybkey
import timeKEY = ybkey()while True:state = KEY.is_press()if state != 0:print("key pressed")while KEY.is_press():  #等待按键松开time.sleep(0.01) time.sleep_ms(100) #消抖

代码测试效果:

按键按下后串口会打印 "key pressed"

定时器定时中断的配置使用:

定时器配置相关函数介绍:

1、先要import相关的库:
from machine import Timer
import time
2、再创建Timer对象,并命名为timer,这里调用初始化的函数与解释如下:
timer = machine.Timer(id, channel, mode=Timer.MODE_ONE_SHOT, period=1000,
unit=Timer.UNIT_MS, callback=None, arg=None, start=True, priority=1, div=0)
id :
Timer ID, [0~2] (Timer.TIMER0~TIMER2)
channel :
Timer 通道 , [Timer.CHANNEL0~Timer.CHANNEL3]
mode :
Timer 模式 , MODE_ONE_SHOT 或者 MODE_PERIODIC 或者 MODE_PWM
period :
Timer 周期 , 在启动定时器后 period 时间, 回调函数将会被调用, (0,~)
unit :
设置周期的单位,默认位毫秒( ms ), Timer.UNIT_S 或者 Timer.UNIT_MS 或者 Timer.UNIT_US 或者 Timer.UNIT_NS
callback :
定时器回调函数, 定义了两个参数, 一个是定时 器对象 Timer , 第二个是在定义对象是希望传的参数 arg ,更多请看 arg 参数解释
3、定时器回调函数:

#该函数是被Timer对象用作定时器到期时的回调,当定时器触发时,该函数会被自动调用
def on_timer(timer):

编写例程序:

from machine import Timer
import time#该函数是被Timer对象用作定时器到期时的回调,当定时器触发时,该函数会被自动调用
def on_timer(timer):print("This is on_timer callback")# 创建一个周期为200毫秒的定时器  
timer = Timer(Timer.TIMER0, Timer.CHANNEL0,mode=Timer.MODE_PERIODIC, period=100,unit=Timer.UNIT_MS, callback=on_timer, arg=None)# 获取当前的时间戳(以毫秒为单位)并存储在last_time变量中 
last_time = time.ticks_ms()
try:while True:# 检查从上一次记录的时间到现在是否过去了至少200毫秒  if time.ticks_ms() - last_time >= 200:# 如果时间差大于等于200毫秒,则更新last_time为当前时间戳 last_time = time.ticks_ms()# 打印一条消息,表示主循环被执行print("This is main loop")# 捕获所有异常(这是一个不推荐的做法,因为会捕获所有的异常,包括意外的和未处理的异常)            
except:timer.deinit()# 删除timer对象,释放其占用的资源  del timer# 删除timer对象,释放其占用的资源

代码测试效果:

串口测试效果展示:

定时器每打印俩次,主程序即打印一次

符合程序指定的:

定时器每100ms打印一次,主函数大于等于200ms打印一次的规律

按键写入照片到TF内存卡:

有了之前的函数学习积累我们现在可以尝试编写python代码来使得按键操作K210拍摄一张照片并写入到TF内存卡

本部分实现功能:

1、LCD循环播放当前采集到的图像,并在左上角显示帧率

2、按下按键不动:

        1)将当前拍摄的一张照片存到TF卡

        2)点亮LED,闪白光,提示提取了当前的照片

        3)停止画面在当前采集到的照片

3、成功采集到一张照片还会有串口反馈

代码编写:

import time,sensor,lcd,image
from modules import ybkey
from modules import ybrgbRGB = ybrgb() #RGB = ybrgb()能够成功创建一个RGB LED控制对象
KEY = ybkey() #按键控制对象
clock = time.clock() #用于计算摄像头的帧率。lcd.init() # 初始化LCD显示屏
sensor.reset() # 重置摄像头传感器
sensor.set_pixformat(sensor.RGB565)  # 设置摄像头的像素格式为RGB565 # RGB565表示红色使用5位,绿色使用6位,蓝色使用5位来表示颜色  
sensor.set_framesize(sensor.QVGA)  # 设置摄像头捕获的图像大小为QVGA(320x240像素) 
sensor.run(1) #用于启动摄像头传感器并设置其工作模式
sensor.skip_frames(10) # 跳过摄像头的前10帧,以便让摄像头稳定下来,避免初始化时的噪点 
print("init ok") #打印提示初始化完成base_path = "/sd/image-" # 设置图片保存的基础路径和文件名前缀 
sequence_number = 1  # 初始序列号 while True:clock.tick()state = KEY.is_press()img = sensor.snapshot() # 使用sensor模块的snapshot方法捕获一帧图像,并将其存储在变量img中 fps = clock.fps() #计算摄像头的帧率img.draw_string(0, 0, "%2.1ffps" %(fps), color=(0, 0, 255), scale=2.0)lcd.display(img)  #显示最新捕获的图像在LCD上 if state != 0:img_path = base_path + str(sequence_number) + ".jpg"  # 生成文件名,如 "image-001.jpg" img = sensor.snapshot() # 使用sensor模块的snapshot方法捕获一帧图像,并将其存储在变量img中  img.save(img_path)    #使用img对象的save方法将图像保存到指定的文件路径 print("Saving image: {img_path}")sequence_number += 1  # 更新序列号while KEY.is_press(): #等待按键松开lcd.display(img)  #显示最新捕获的图像在LCD上RGB.set(1, 1, 1)time.sleep(0.01) time.sleep_ms(50) #消抖RGB.set(0, 0, 0)

代码测试结果:

拔出TF卡,插入读卡器,插入电脑查看文件夹发现成功拍摄一系列照片并存入TF卡:

打开一张观察发现像素不是很高:

IDE预览镜头使用提示:

关闭IDE预览镜头可以提升帧率!:
 

相关文章:

K210视觉识别模块学习笔记3:内存卡写入拍摄图片_LED三色灯的操作_按键操作_定时器的配置使用

今日开始学习K210视觉识别模块: LED三色灯的操作_按键操作_定时器的配置使用_内存卡写入拍摄图片 亚博智能的K210视觉识别模块...... 固件库版本: canmv_yahboom_v2.1.1.bin 本文最终目的是编写一个按键拍照的例程序: 为以后的专用场景的模型训练做准备&#xf…...

如何定义“智慧校园”这个概念

在信息爆炸的时代,教育面临着前所未有的挑战:如何让每个学生在海量知识中找到属于自己的路径?如何让教师的智慧与科技的力量相得益彰?如何让校园成为培养创新思维的摇篮?智慧校园,这一概念的提出&#xff0…...

OpenSSL自签名证书

文章目录 生成1. 生成根证书的私钥(root_private_key.pem)2. 创建根证书的CSR和自签名证书(root_csr.pem)3. 生成服务器证书的私钥(server_private_key.pem)4. 创建服务器证书的CSR(server_priv…...

QtCreator调试运行工程报错,无法找到相关库的的解决方案

最新在使用国产化平台做qt应用开发时,总是遇到qtcreator内调试运行 找不到动态库的问题,为什么会出现这种问题呢?明明编译的时候能够正常通过,运行或者调试的时候找不到相关的库呢?先说结论,排除库本身的问…...

【Python系列】Python 元组(Tuple)详解

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

特征融合篇 | YOLOv8 引入动态上采样模块 | 超过了其他上采样器

1. 介绍 本篇介绍了一种将动态上采样模块引入 YOLOv8 目标检测算法的新方法,该方法在 COCO 数据集上获得了 55.7% 的 mAP,超越了其他上采样器。该方法将动态上采样模块引入到 YOLOv8 的特征融合阶段,能够根据输入图像的特征分辨率动态调整上…...

​​​​​​​Beyond Compare 3密钥被撤销的解决办法

首先,BCompare3的链接如下 链接:https://pan.baidu.com/s/1vuSxY0cVQCt0-8CpFzUhvg 提取码:8888 --来自百度网盘超级会员V7的分享 1.问题现象 激活之后在使用过程中有时候会出现密钥被撤销的警告,而且该工具无法使用&#xff…...

知识见闻 - 人和动物的主要区别

人类和动物的主要区别之一确实在于理性,但这只是众多区别中的一个方面。以下是一些更全面的比较,突出人类和动物之间的主要区别: 理性和抽象思维: 人类:人类具有高度发展的理性能力,可以进行抽象思维、逻辑…...

Javaweb基础之工程路径

大家好,这里是教授.F 引入: 工程路径有一个知识点需要注意:就是相对路径。所谓相对路径就是依赖当前位置: 相对路径的定位依赖于当前位置或参考位置。 使用相对路径来解决, 一个非常重要的规则:页面所有的…...

国际荐酒师(香港)协会受邀出席广州意大利国庆晚宴

2024年5月30日,意大利驻广州总领事馆举办的2024年意大利国庆招待会及晚宴,庆祝意大利共和国成立。此次晚宴旨在促进中意两国之间的文化交流与合作。国际荐酒师(香港)协会受主办方邀请参与了这一重要活动。 国际荐酒师(…...

让驰骋BPM系统插上AI的翅膀

让驰骋BPM系统插上AI的翅膀 在当今日益复杂多变的商业环境中,业务流程管理(BPM)系统的应用愈发广泛,成为企业提高效率、优化流程、降低成本的重要工具。驰骋BPM系统凭借其出色的性能和丰富的功能,赢得了众多企业的青睐…...

排队论 | 基于排队机制实现智能仓储机器人巡逻及避碰

研究背景: 智能仓储机器人在现代物流行业中扮演着重要的角色,能够提高仓库的运作效率和准确性。然而,仓储机器人在巡逻过程中可能会遇到其他机器人或障碍物,这就需要解决排队和避碰问题,以确保安全和高效的运作。 研究路线: 背景调研:了解智能仓储机器人的发展和应用…...

Node.js和npm常用命令

一、Node.js简介 Node.js是一个免费、开源、跨平台的JavaScript运行时环境,允许开发人员创建服务器、web应用程序、命令行工具和脚本。 点击查看node.js中文官网 点击查看node.js英文官网 二、npm简介 npm(Node Package Manager)是Node.js的软件包管理器&#xff0…...

pytest +allure在测试中的应用

一、allure配置: 1、安装allure库 pip install allure-pytest2、代码中导入 import allure3、常用命令: 1)、 pytest --alluredir报告目录 测试脚本.py比如:pytest --alluredir./allure_report (未指定执行所有) 2&…...

004 CentOS 7.9 mongodb7.0.11安装及配置

https://www.mongodb.com/try/download/shell https://www.mongodb.com/try/download/community 文章目录 /etc/mongod.conf在 /etc/systemd/system/ 目录下创建一个名为 mongod.service 的文件重新加载 systemd 配置:启用服务:现在,可以手动…...

Docker安装Redis(云服务器)

准备: 在云服务器中开启6370端口号 docker run -d --name redis -p 6379:6379 redis 这条命令使用docker运行一个名为"redis"的容器,映射容器的6379端口到主机的6379端口,并且使用redis镜像来运行容器。REDIS是一个开源的内存数据…...

springboot中抽象类无法注入到ioc容器

1、背景 在写代码时,发现service接口有两个实现类,并且两个实现类中没有对类名重命名,属性注入的时候也没有使用byName或Qualifier,正确情况下会发生多实现报错的问题,以前对这个问题进行解析过。 2、调试过程 我想…...

Java关键字大冒险:深入浅出地理解Java的精髓

Java编程语言中的关键字就像是魔法咒语,每一个都有自己独特的作用。在这篇博客中,我们将探讨Java中最常见的关键字,并通过有趣的例子和形象的比喻,让你轻松掌握它们的用法。 1. public: 万能钥匙 public关键字是Java中的“万能钥…...

Android Kotlin 打开相册选择图片(多选)

1. 核心代码 打开系统相册功能,本代码使用两种方式打开本地相册,startActivityForResult 已经废弃,可以使用新的方式。 package com.example.facedetectordemoimport android.content.pm.PackageManager import androidx.appcompat.app.App…...

java学习路径

ProcessOn Mindmap...

<6>-MySQL表的增删查改

目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表&#xf…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...

Caliper 配置文件解析:fisco-bcos.json

config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...