去年做啥網(wǎng)站能致富廣州中小企業(yè)seo推廣運(yùn)營(yíng)
今日開始學(xué)習(xí)K210視覺識(shí)別模塊:
LED三色燈的操作_按鍵操作_定時(shí)器的配置使用_內(nèi)存卡寫入拍攝圖片
亞博智能的K210視覺識(shí)別模塊......??
固件庫(kù)版本:? canmv_yahboom_v2.1.1.bin
本文最終目的是編寫一個(gè)按鍵拍照的例程序:
為以后的專用場(chǎng)景的模型訓(xùn)練做準(zhǔn)備,因?yàn)橛?xùn)練自己的模型需要大量的圖片,并人工標(biāo)注
圖片的來源最好是K210自己拍攝的,(其他設(shè)備拍也行):
我個(gè)人認(rèn)為這樣訓(xùn)練出的模型會(huì)更貼合K210自身的實(shí)際識(shí)別場(chǎng)景,并且基礎(chǔ)像素不會(huì)太高(現(xiàn)在手機(jī)像素動(dòng)不動(dòng)就破一億,會(huì)給簡(jiǎn)單的識(shí)別運(yùn)算增加負(fù)擔(dān))
文章提供測(cè)試代碼講解、完整代碼貼出、測(cè)試效果圖
目錄
LED三色燈的操作使用:
代碼測(cè)試效果:
按鍵的操作使用:
代碼測(cè)試效果:
定時(shí)器定時(shí)中斷的配置使用:
定時(shí)器配置相關(guān)函數(shù)介紹:
編寫例程序:
代碼測(cè)試效果:
按鍵寫入照片到TF內(nèi)存卡:
本部分實(shí)現(xiàn)功能:
代碼編寫:
代碼測(cè)試結(jié)果:
LED三色燈的操作使用:
本段實(shí)驗(yàn)?zāi)康?#xff1a;
開啟LED三色顯示 使用系統(tǒng)延時(shí)......
LED每隔一秒切換顏色點(diǎn)亮,并用串口打印當(dāng)前點(diǎn)亮顏色情況
該例程序告訴我們?nèi)绾蝘mport RGB三色燈的庫(kù)頭文件以及每個(gè)顏色燈的設(shè)置參數(shù):
time.sleep(1)表示 系統(tǒng)延時(shí)一秒:
from modules import ybrgb import time RGB = ybrgb() #RGB = ybrgb()能夠成功創(chuàng)建一個(gè)RGB LED控制對(duì)象while True: #RGB.set(r, g, b)函數(shù)能夠正確接收三個(gè)參數(shù)(紅色、綠色、藍(lán)色的亮度值,范圍通常是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)
代碼測(cè)試效果:
該段代碼可以直接放在IDE中進(jìn)行測(cè)試:效果就是每個(gè)一秒進(jìn)行LED循環(huán)切換顯示顏色:
紅、綠、藍(lán)、白、滅,并且串口同步發(fā)送當(dāng)前顏色顯示情況:
按鍵的操作使用:
本段實(shí)驗(yàn)?zāi)康?#xff1a;
按下一次按鍵后串口就打印一次提示
以下代碼展示了如何調(diào)用KEY的使用方法:
(與官方例程略有不同,添加了等待按鍵松開的循環(huán))
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) #消抖
代碼測(cè)試效果:
按鍵按下后串口會(huì)打印 "key pressed"
定時(shí)器定時(shí)中斷的配置使用:
定時(shí)器配置相關(guān)函數(shù)介紹:
1、先要import相關(guān)的庫(kù):from machine import Timer import time
2、再創(chuàng)建Timer對(duì)象,并命名為timer,這里調(diào)用初始化的函數(shù)與解釋如下: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_PWMperiod :Timer 周期 , 在啟動(dòng)定時(shí)器后 period 時(shí)間, 回調(diào)函數(shù)將會(huì)被調(diào)用, (0,~)unit :設(shè)置周期的單位,默認(rèn)位毫秒( ms ), Timer.UNIT_S 或者 Timer.UNIT_MS 或者 Timer.UNIT_US 或者 Timer.UNIT_NScallback :定時(shí)器回調(diào)函數(shù), 定義了兩個(gè)參數(shù), 一個(gè)是定時(shí) 器對(duì)象 Timer , 第二個(gè)是在定義對(duì)象是希望傳的參數(shù) arg ,更多請(qǐng)看 arg 參數(shù)解釋3、定時(shí)器回調(diào)函數(shù):#該函數(shù)是被Timer對(duì)象用作定時(shí)器到期時(shí)的回調(diào),當(dāng)定時(shí)器觸發(fā)時(shí),該函數(shù)會(huì)被自動(dòng)調(diào)用 def on_timer(timer):
編寫例程序:
from machine import Timer import time#該函數(shù)是被Timer對(duì)象用作定時(shí)器到期時(shí)的回調(diào),當(dāng)定時(shí)器觸發(fā)時(shí),該函數(shù)會(huì)被自動(dòng)調(diào)用 def on_timer(timer):print("This is on_timer callback")# 創(chuàng)建一個(gè)周期為200毫秒的定時(shí)器 timer = Timer(Timer.TIMER0, Timer.CHANNEL0,mode=Timer.MODE_PERIODIC, period=100,unit=Timer.UNIT_MS, callback=on_timer, arg=None)# 獲取當(dāng)前的時(shí)間戳(以毫秒為單位)并存儲(chǔ)在last_time變量中 last_time = time.ticks_ms() try:while True:# 檢查從上一次記錄的時(shí)間到現(xiàn)在是否過去了至少200毫秒 if time.ticks_ms() - last_time >= 200:# 如果時(shí)間差大于等于200毫秒,則更新last_time為當(dāng)前時(shí)間戳 last_time = time.ticks_ms()# 打印一條消息,表示主循環(huán)被執(zhí)行print("This is main loop")# 捕獲所有異常(這是一個(gè)不推薦的做法,因?yàn)闀?huì)捕獲所有的異常,包括意外的和未處理的異常) except:timer.deinit()# 刪除timer對(duì)象,釋放其占用的資源 del timer# 刪除timer對(duì)象,釋放其占用的資源
代碼測(cè)試效果:
串口測(cè)試效果展示:
定時(shí)器每打印倆次,主程序即打印一次
符合程序指定的:
定時(shí)器每100ms打印一次,主函數(shù)大于等于200ms打印一次的規(guī)律
按鍵寫入照片到TF內(nèi)存卡:
有了之前的函數(shù)學(xué)習(xí)積累我們現(xiàn)在可以嘗試編寫python代碼來使得按鍵操作K210拍攝一張照片并寫入到TF內(nèi)存卡
本部分實(shí)現(xiàn)功能:
1、LCD循環(huán)播放當(dāng)前采集到的圖像,并在左上角顯示幀率
2、按下按鍵不動(dòng):
??????? 1)將當(dāng)前拍攝的一張照片存到TF卡
??????? 2)點(diǎn)亮LED,閃白光,提示提取了當(dāng)前的照片
??????? 3)停止畫面在當(dāng)前采集到的照片
3、成功采集到一張照片還會(huì)有串口反饋
代碼編寫:
import time,sensor,lcd,image
from modules import ybkey
from modules import ybrgbRGB = ybrgb() #RGB = ybrgb()能夠成功創(chuàng)建一個(gè)RGB LED控制對(duì)象
KEY = ybkey() #按鍵控制對(duì)象
clock = time.clock() #用于計(jì)算攝像頭的幀率。lcd.init() # 初始化LCD顯示屏
sensor.reset() # 重置攝像頭傳感器
sensor.set_pixformat(sensor.RGB565) # 設(shè)置攝像頭的像素格式為RGB565 # RGB565表示紅色使用5位,綠色使用6位,藍(lán)色使用5位來表示顏色
sensor.set_framesize(sensor.QVGA) # 設(shè)置攝像頭捕獲的圖像大小為QVGA(320x240像素)
sensor.run(1) #用于啟動(dòng)攝像頭傳感器并設(shè)置其工作模式
sensor.skip_frames(10) # 跳過攝像頭的前10幀,以便讓攝像頭穩(wěn)定下來,避免初始化時(shí)的噪點(diǎn)
print("init ok") #打印提示初始化完成base_path = "/sd/image-" # 設(shè)置圖片保存的基礎(chǔ)路徑和文件名前綴
sequence_number = 1 # 初始序列號(hào) while True:clock.tick()state = KEY.is_press()img = sensor.snapshot() # 使用sensor模塊的snapshot方法捕獲一幀圖像,并將其存儲(chǔ)在變量img中 fps = clock.fps() #計(jì)算攝像頭的幀率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方法捕獲一幀圖像,并將其存儲(chǔ)在變量img中 img.save(img_path) #使用img對(duì)象的save方法將圖像保存到指定的文件路徑 print("Saving image: {img_path}")sequence_number += 1 # 更新序列號(hào)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)
代碼測(cè)試結(jié)果:
拔出TF卡,插入讀卡器,插入電腦查看文件夾發(fā)現(xiàn)成功拍攝一系列照片并存入TF卡:
打開一張觀察發(fā)現(xiàn)像素不是很高:
IDE預(yù)覽鏡頭使用提示:
關(guān)閉IDE預(yù)覽鏡頭可以提升幀率!:
?