**非常詳細(xì)的視頻和文字教程,講解常見(jiàn)的openmv教程包括 巡線、物體識(shí)別、圓環(huán)識(shí)別、閾值自動(dòng)獲取等。非常適合學(xué)習(xí)openmv、K210、K230等項(xiàng)目
視頻合集鏈接在
openmv教程合集 openmv入門(mén)到項(xiàng)目開(kāi)發(fā) openmv和STM32通信 openmv和opencv區(qū)別 openmv巡線 openmv數(shù)字識(shí)別教程LCD
專(zhuān)刊openmv視覺(jué)文章鏈接:
https://blog.csdn.net/qq_46187594/category_12900902.html
3.5.1-不同數(shù)字識(shí)別方案的大概介紹
截至現(xiàn)在openmv實(shí)現(xiàn)的數(shù)字識(shí)別方案有幾個(gè)大類(lèi),
- 模板匹配識(shí)別方案 大概效果:最后優(yōu)化 將可能色塊縮放到模板大小一樣,能夠完成不錯(cuò)效果,且識(shí)別速度很快,但是傾斜數(shù)字識(shí)別效果一般。
- mnist數(shù)字?jǐn)?shù)據(jù)集識(shí)別方案 大概效果: 只能一次識(shí)別一個(gè)數(shù)字,效果一般。
- openmv 目標(biāo)檢測(cè)識(shí)別 大概效果:效果根據(jù)數(shù)據(jù)集來(lái)定,數(shù)據(jù)集中出現(xiàn)的情況都能比較好的識(shí)別,所以需要根據(jù)自己的需要采集適合的數(shù)據(jù)集,識(shí)別幀率稍微慢些。具體的識(shí)別效果和幀率怎么樣大家可以看后面的視頻展示的,或者自己實(shí)現(xiàn)測(cè)試看看是否滿足需要這里大家盡量和我使用一樣的openmv IDE軟件版本和一樣的openmv 固件版本,也可能出現(xiàn)一些錯(cuò)誤,如果錯(cuò)誤要學(xué)會(huì)調(diào)試解決,可以提供下面思路: 出現(xiàn)了什么現(xiàn)象或者報(bào)錯(cuò)?是否測(cè)試過(guò)自己電腦USB是否可能有問(wèn)題或者用朋友電腦試試?是否重啟電腦嘗試過(guò)?
是否在必應(yīng)或谷歌或者AI上檢索提問(wèn),是否按照給出信息嘗試解決錯(cuò)誤? 自己本身使用的openmv 固件還有openmv IDE 是否 測(cè)試過(guò)和 視頻一樣的軟件和固件版本,是否測(cè)試測(cè)試過(guò)最新的軟件和固件版本。
3.5.2-模板匹配識(shí)別
1-只匹配一個(gè)模板
我們只匹配一個(gè)模板的時(shí)候不需要插上SD卡
無(wú)論是使用openmv H7 還是 openmv H7 plus做下面各種數(shù)字識(shí)別方案基本都是不需要使用SD卡,除非你使用模型特別大或者模板特別多,所以 建議大家可以先不用SD進(jìn)行測(cè)試使用,如果空間不足再使用SD卡,這樣也可以節(jié)省一點(diǎn)。
首先,我們需要?jiǎng)?chuàng)建或?qū)胍粋€(gè)模板,注意這個(gè)模板必須得是pgm格式的,而且大小有限制,不能超過(guò)openmv的像素大小。 我們可以直接從openmv里面截取一個(gè)模板圖像,可以先運(yùn)行基礎(chǔ)的攝像頭圖像獲取的例程,讓openmv IDE軟件 顯示出圖像,然后進(jìn)行截取。
比如先運(yùn)行這個(gè)之前的代碼
# This work is licensed under the MIT license.
# Copyright (c) 2013-2023 OpenMV LLC. All rights reserved.
# https://github.com/openmv/openmv/blob/master/LICENSE
#
# Hello World Example
#
# Welcome to the OpenMV IDE! Click on the green run arrow button below to run the script!
import sensor # 引入感光元件的模塊,用于操作攝像頭傳感器
import time # 引入時(shí)間模塊,用于控制時(shí)間延遲和FPS計(jì)算
# 初始化傳感器
sensor.reset() # Reset and initialize the sensor. 重置并初始化傳感器
sensor.set_pixformat(sensor.RGB565) # Set pixel format to RGB565 (or GRAYSCALE) 設(shè)置像素格式為RGB565(或者灰度)
sensor.set_framesize(sensor.QVGA) # Set frame size to QVGA (320x240) 設(shè)置幀大小為QVGA(320x240分辨率)
#***************************如果不需要鏡像就注釋掉 下面 的代碼********************
# 設(shè)置攝像頭鏡像/翻轉(zhuǎn)操作,根據(jù)攝像頭安裝的方向決定是否需要
sensor.set_vflip(True) # 垂直方向翻轉(zhuǎn)。根據(jù)實(shí)際攝像頭模塊的安裝位置調(diào)整是否需要此操作
#?。?!重要:不同攝像頭是否需要鏡像,根據(jù)實(shí)際情況定。如果不需要鏡像,請(qǐng)注釋掉以下代碼:
sensor.set_hmirror(True) # 水平方向反轉(zhuǎn)。根據(jù)實(shí)際攝像頭模塊的安裝位置調(diào)整是否需要此操作
#?。?!重要:不同攝像頭是否需要鏡像,根據(jù)實(shí)際情況定。如果不需要鏡像,請(qǐng)注釋掉上述代碼。
#***************************如果不需要鏡像就注釋掉 上面 的代碼********************
sensor.skip_frames(time=2000) # Wait for settings take effect. 等待2秒鐘讓設(shè)置生效
clock = time.clock() # Create a clock object to track the FPS. 創(chuàng)建一個(gè)時(shí)鐘對(duì)象,用于追蹤FPS(每秒幀數(shù))
while True:
clock.tick() # Update the FPS clock. 更新FPS時(shí)鐘
img = sensor.snapshot() # Take a picture and return the image. 拍攝一張照片并返回圖像
print(clock.fps()) # 輸出當(dāng)前的幀率(FPS),用來(lái)衡量攝像頭的拍攝速度
# Note: OpenMV Cam runs about half as fast when connected
# to the IDE. The FPS should increase once disconnected.
# 注意:當(dāng)OpenMV相機(jī)連接到IDE時(shí),速度大約是平時(shí)的一半。斷開(kāi)連接后,F(xiàn)PS應(yīng)該會(huì)提高。
然后把openmv和要識(shí)別的物體
截取模板的時(shí)候物體光線要和真實(shí)識(shí)別的時(shí)候基本一樣
攝像頭照射角度和舉例,真實(shí)識(shí)別的要基本一樣
然后不要在IDE上開(kāi)啟縮放
右擊講框選的模板區(qū)域保存到PC
選擇保存到電腦
同樣道理保存你要識(shí)別的數(shù)字模板,這里保存的是0-9,如果你只識(shí)別1-8那么你只保存1-8就可以了
注意從openmv里面直接截取保存的圖片是bmp格式的,我們需要把它轉(zhuǎn)換成pgm格式。可以在這個(gè)網(wǎng)站進(jìn)行在線轉(zhuǎn)換https://convertio.co/zh/bmp-pgm/ 或者BMP 到 PGM - 將您的 BMP 轉(zhuǎn)換為 PGM 的在線工具 或者免費(fèi)BMP轉(zhuǎn)PGM在線轉(zhuǎn)換器 三個(gè)網(wǎng)站都可以,或者也可以百度上搜索BMP格式轉(zhuǎn)pgm格式。
網(wǎng)站上轉(zhuǎn)化后保存如下
然后選擇你要匹配那個(gè)模板,放到openmv識(shí)別的內(nèi)存中,比如我們這里演示識(shí)別數(shù)字9
代碼如下:
# 模板匹配示例 - 歸一化交叉相關(guān)算法(NCC)
# 功能增強(qiáng)說(shuō)明:
# 1. 增加模板文件名顯示在識(shí)別框上方
# 2. 添加識(shí)別結(jié)果輸出功能
# 3. 優(yōu)化代碼結(jié)構(gòu)并增加詳細(xì)注釋
import time
import sensor
import image
from image import SEARCH_EX, SEARCH_DS # 導(dǎo)入搜索模式常量
# ******************** 系統(tǒng)初始化配置 ********************
# 初始化攝像頭傳感器
sensor.reset()
# 設(shè)置圖像參數(shù)
sensor.set_contrast(1) # 對(duì)比度設(shè)置(范圍0-3)
sensor.set_gainceiling(16) # 增益上限(防止過(guò)曝光)
sensor.set_framesize(sensor.QQVGA) # 設(shè)置分辨率160x120(NCC算法推薦分辨率)
sensor.set_pixformat(sensor.GRAYSCALE) # 使用灰度圖模式(提升處理速度)
# 攝像頭安裝方向校正(根據(jù)物理安裝情況選擇)
sensor.set_vflip(True) # 垂直翻轉(zhuǎn)圖像
sensor.set_hmirror(True) # 水平翻轉(zhuǎn)圖像
# ******************** 用戶可配置參數(shù) ********************
TEMPLATE_PATH = "/9.pgm" # 模板文件存儲(chǔ)路徑
MATCH_THRESHOLD = 0.70 # 匹配閾值(0.0-1.0,值越大匹配越嚴(yán)格)
SEARCH_STEP = 4 # 搜索步長(zhǎng)(越大搜索越快,但可能漏檢)
SEARCH_MODE = SEARCH_EX # 搜索模式:SEARCH_EX-全搜索,SEARCH_DS-菱形搜索
TEXT_COLOR = 255 # 顯示文本顏色(灰度值,255=白色)
FRAME_MARGIN = 5 # 文字與識(shí)別框的間距(像素)
# 加載模板圖像
try:
template = image.Image(TEMPLATE_PATH)
print("成功加載模板:", TEMPLATE_PATH)
except Exception as e:
raise Exception("模板加載失敗:%s" % str(e))
# 創(chuàng)建性能計(jì)數(shù)器
clock = time.clock()
# ******************** 主循環(huán) ********************
while(True):
clock.tick() # 開(kāi)始跟蹤幀率
# 捕獲一幀圖像
img = sensor.snapshot()
# 執(zhí)行模板匹配
# find_template參數(shù)說(shuō)明:
# template: 模板圖像對(duì)象
# threshold: 匹配閾值(0.0-1.0)
# roi: 感興趣區(qū)域(x,y,w,h),默認(rèn)全圖搜索
# step: 搜索步長(zhǎng)(越大越快,精度越低)
# search: 搜索模式(SEARCH_EX或SEARCH_DS)
result = img.find_template(template, MATCH_THRESHOLD,
step=SEARCH_STEP, search=SEARCH_MODE)
# 如果檢測(cè)到目標(biāo)
if result:
# 解包匹配結(jié)果(x,y,w,h)
x, y, w, h = result
# 繪制識(shí)別框
img.draw_rectangle(result, color=TEXT_COLOR)
# 在識(shí)別框上方顯示文件名
# 計(jì)算文本位置:x坐標(biāo)對(duì)齊框左側(cè),y坐標(biāo)在框上方
text_x = x
text_y = y - FRAME_MARGIN if y > FRAME_MARGIN else 0
img.draw_string(text_x, text_y, TEMPLATE_PATH.split('/')[-1], # 顯示文件名
color=TEXT_COLOR, scale=0.5)
# 通過(guò)輸出識(shí)別結(jié)果
# 格式:檢測(cè)時(shí)間(ms), 模板文件名, 坐標(biāo)(x,y), 匹配相似度
# 注意:實(shí)際相似度需要從匹配結(jié)果中獲取,當(dāng)前固件暫不支持返回相似度值
print("[{:.0f}] 檢測(cè)到模板: {}, 位置: ({},{})".format(
time.ticks_ms(), TEMPLATE_PATH, x, y))
# 顯示幀率(保留1位小數(shù))
fps = clock.fps()
img.draw_string(5, 5, "FPS:%.1f" % fps, color=TEXT_COLOR)
print("當(dāng)前幀率:", fps)
識(shí)別結(jié)果顯示情況如下: