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

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

pam_env.so模块配置解析

在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

面向无人机海岸带生态系统监测的语义分割基准数据集

描述&#xff1a;海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而&#xff0c;目前该领域仍面临一个挑战&#xff0c;即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...