**非常詳細的視頻和文字教程,講解常見的openmv教程包括 巡線、物體識別、圓環(huán)識別、閾值自動獲取等。非常適合學習openmv、K210、K230等項目
視頻合集鏈接在
openmv教程合集 openmv入門到項目開發(fā) openmv和STM32通信 openmv和opencv區(qū)別 openmv巡線 openmv數(shù)字識別教程LCD
專刊openmv視覺文章鏈接:
https://blog.csdn.net/qq_46187594/category_12900902.html
2-匹配多個模板的
上面我們演示了如何實現(xiàn)匹配一個模板的,下面演示如何實現(xiàn)匹配多個模板的
首先把直接處理的文件都放進去pgm 按照一定的命名都放到openmv識別成的U盤里面
然后下面是我們的0-9數(shù)字識別功能代碼
# 多模板匹配系統(tǒng) - 數(shù)字識別增強版
# 核心功能:
# 1. 支持0-9數(shù)字模板實時匹配
# 2. 可視化識別結果及性能指標
# 3. 結構化數(shù)據(jù)輸出
import time
import sensor
import image
from image import SEARCH_EX # 導入窮舉搜索模式
# ******************** 攝像頭初始化配置 ********************
sensor.reset() # 復位攝像頭硬件
sensor.set_contrast(1) # 設置對比度(范圍0-3)
sensor.set_gainceiling(16) # 設置最大增益值(防止過曝光)
sensor.set_framesize(sensor.QQVGA) # 設置圖像分辨率160x120
sensor.set_pixformat(sensor.GRAYSCALE) # 使用灰度圖像模式(提升處理速度)
sensor.set_vflip(True) # 垂直翻轉圖像(根據(jù)攝像頭物理安裝方向調整)
sensor.set_hmirror(True) # 水平鏡像圖像(根據(jù)實際需要調整)
# ******************** 用戶可配置參數(shù) ********************
TEMPLATE_PATHS = [ # 模板文件路徑列表
"/0.pgm", "/1.pgm", "/2.pgm", # 模板文件應存放在OpenMV存儲根目錄
"/3.pgm", "/4.pgm", "/5.pgm", # 建議使用32x32像素灰度圖像
"/6.pgm", "/7.pgm", "/8.pgm",
"/9.pgm"
]
MATCH_THRESHOLD = 0.70 # 匹配相似度閾值(0.0-1.0,值越大匹配越嚴格)
SEARCH_STEP = 4 # 搜索步長(增大可提升速度但降低精度)
TEXT_COLOR = 255 # 顯示文本顏色(灰度模式下255=白色)
TEXT_OFFSET = 5 # 文本與識別框的垂直間距(像素)
# ******************** 模板預加載系統(tǒng) ********************
class TemplateLoader:
"""
模板加載管理器,實現(xiàn):
1. 啟動時預加載所有模板到內存
2. 自動從文件路徑提取模板名稱
3. 提供錯誤加載提示功能
"""
def __init__(self):
self.templates = [] # 模板存儲列表
self.load_templates() # 初始化時自動加載模板
def load_templates(self):
"""加載并驗證所有模板文件"""
for path in TEMPLATE_PATHS:
try:
# 從文件路徑提取模板名稱(示例:"/9.pgm" -> "9")
# split("/")[-1]獲取文件名,split(".")[0]去除擴展名
name = path.split("/")[-1].split(".")[0]
# 構建模板字典對象
template = {
"image": image.Image(path), # 加載模板圖像到內存
"name": name, # 存儲簡化名稱
"path": path # 保留完整路徑用于調試
}
self.templates.append(template)
print(f"預加載成功:{path} -> {name}")
except Exception as e:
# 捕獲文件不存在或格式錯誤等異常
print(f"加載失敗:{path} ({str(e)})")
# 實例化模板加載器(程序啟動時自動執(zhí)行加載)
template_loader = TemplateLoader()
# 初始化性能計數(shù)器(用于計算幀率)
clock = time.clock()
# ******************** 主處理循環(huán) ********************
while(True):
clock.tick() # 開始幀計時
# 圖像采集處理流程
img = sensor.snapshot() # 捕獲一幀圖像
# 多模板匹配流程
for template in template_loader.templates:
# 執(zhí)行模板匹配操作
# find_template參數(shù)說明:
# template - 預加載的模板圖像對象
# threshold - 相似度閾值
# step - 搜索步長(影響速度和精度)
# search - 搜索模式(SEARCH_EX為全搜索)
result = img.find_template(template["image"],
MATCH_THRESHOLD,
step=SEARCH_STEP,
search=SEARCH_EX)
if result: # 當匹配結果有效時
# 解包匹配區(qū)域坐標(x,y)和尺寸(width,height)
x, y, w, h = result
# 可視化處理部分
# 繪制紅色矩形框標記識別區(qū)域(顏色值255在灰度模式顯示為白色)
img.draw_rectangle(result, color=TEXT_COLOR)
# 計算文本顯示位置(防止超出圖像上邊界)
text_y = y - TEXT_OFFSET if y > TEXT_OFFSET else 0
# 在識別框上方顯示模板名稱
# 參數(shù)說明:
# x - 文本左上角X坐標(對齊識別框左側)
# text_y - 垂直位置(識別框上方5像素)
# template["name"] - 顯示的文本內容
# color - 文本顏色
# scale - 字體縮放比例
# mono_space - 啟用等寬字體顯示
img.draw_string(x, text_y, template["name"],
color=TEXT_COLOR,
scale=1,
mono_space=True)
# 數(shù)據(jù)輸出部分
# 輸出格式:[時間戳] 識別到 模板名稱 坐標: (中心X, 中心Y)
print("[{:.0f}] 識別到 {} 坐標: ({},{})".format(
time.ticks_ms(), # 獲取系統(tǒng)毫秒時間戳
template["name"], # 模板名稱
x + w//2, # 計算區(qū)域中心X坐標
y + h//2 # 計算區(qū)域中心Y坐標
))
# 實時性能顯示
fps = clock.fps() # 計算實際幀率
# 在畫面左上角顯示幀率信息(避免遮擋識別結果)
# 參數(shù)5,5表示距離左上角5像素的起始位置
img.draw_string(5, 5, "FPS:%.1f" % fps, color=TEXT_COLOR)
識別到會輸出在
注意:如果覺得經(jīng)常誤識別,可以調整識別的匹配閾值
MATCH_THRESHOLD = 0.70 # 匹配相似度閾值(0.0-1.0,值越大匹配越嚴格)
閱讀全文