• 方案介紹
  • 附件下載
  • 相關(guān)推薦
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

3.5.2-4-先識(shí)別框 框內(nèi)數(shù)字識(shí)別 數(shù)字模板匹配 openmv K210 k230

04/11 08:28
879
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

聯(lián)系方式.txt

共1個(gè)文件

**非常詳細(xì)的視頻和文字教程,講解常見的openmv教程包括 巡線、物體識(shí)別、圓環(huán)識(shí)別、閾值自動(dòng)獲取等。非常適合學(xué)習(xí)openmv、K210、K230等項(xiàng)目
視頻合集鏈接在


openmv教程合集 openmv入門到項(xiàng)目開發(fā) openmv和STM32通信 openmv和opencv區(qū)別 openmv巡線 openmv數(shù)字識(shí)別教程LCD

專刊openmv視覺(jué)文章鏈接:
https://blog.csdn.net/qq_46187594/category_12900902.html

一種常見的識(shí)別算法優(yōu)化方法,先根據(jù)物體特征縮小識(shí)別范圍,在特征的范圍內(nèi)進(jìn)行某種識(shí)別算法,比如根據(jù)數(shù)字是黑色方框框起來(lái)的特征,先識(shí)別黑色框,然后框內(nèi)進(jìn)行匹配。

我們使用3.5.2中的2的進(jìn)行優(yōu)化,優(yōu)化方式是 先讓openmv識(shí)別框,然后框內(nèi)進(jìn)行數(shù)字模板匹配
在這里插入圖片描述
效果還可以幀率20左右,可以識(shí)別到的框然后進(jìn)行數(shù)字識(shí)別的,偶爾會(huì)識(shí)別不到兩個(gè)數(shù)字,可能只能識(shí)別一個(gè)數(shù)字

下面這個(gè)代碼幀率20,可以同時(shí)識(shí)別兩個(gè)數(shù)字,

# 多模板匹配系統(tǒng) 
import time
import sensor
import image

# ******************** 硬件初始化配置 ********************
sensor.reset()                      # 復(fù)位攝像頭硬件
sensor.set_contrast(1)             # 設(shè)置對(duì)比度(范圍0-3)
sensor.set_gainceiling(16)         # 設(shè)置最大增益值(2^16)
sensor.set_framesize(sensor.QQVGA) # 設(shè)置分辨率160x120(低分辨率提升處理速度)
sensor.set_pixformat(sensor.GRAYSCALE)  # 灰度圖像模式(減少計(jì)算量)
sensor.set_vflip(True)             # 垂直翻轉(zhuǎn)圖像(適配攝像頭安裝方向)
sensor.set_hmirror(True)           # 水平鏡像圖像(解決鏡頭鏡像問(wèn)題)

# ******************** 用戶可調(diào)參數(shù) ********************
TEMPLATE_PATHS = [                 # 模板文件路徑列表(按0-9順序)
    "/0.pgm", "/1.pgm", "/2.pgm",
    "/3.pgm", "/4.pgm", "/5.pgm",
    "/6.pgm", "/7.pgm", "/8.pgm",
    "/9.pgm"
]
MATCH_THRESHOLD = 0.65           # 模板匹配相似度閾值(0.0-1.0)
RECT_THRESHOLD = 25000           # 矩形檢測(cè)敏感度(值越小敏感度越高)
MIN_RECT_WIDTH = 15              # 最小矩形寬度(需大于最大模板寬度)
MIN_RECT_HEIGHT = 15             # 最小矩形高度(需大于最大模板高度)
TEXT_COLOR = 255                 # 顯示顏色(灰度值,255為白色)
TEXT_OFFSET = 5                  # 文本標(biāo)注偏移量(像素)

# ******************** 模板管理系統(tǒng) ********************
class TemplateLoader:
    def __init__(self):
        self.templates = []       # 存儲(chǔ)加載的模板信息
        self.min_template_w = 999 # 記錄最小模板寬度(用于尺寸校驗(yàn))
        self.min_template_h = 999 # 記錄最小模板高度
        self.load_templates()     # 初始化時(shí)自動(dòng)加載模板

    def load_templates(self):
        """模板加載與管理系統(tǒng)
        功能:批量加載模板文件并記錄尺寸信息
        安全機(jī)制:異常捕獲+詳細(xì)加載報(bào)告"""
        print("n====== 模板加載報(bào)告 ======")
        for path in TEMPLATE_PATHS:
            try:
                # 加載模板圖像并提取尺寸信息
                template_img = image.Image(path)
                w, h = template_img.width(), template_img.height()
                
                # 更新最小模板尺寸記錄
                self.min_template_w = min(self.min_template_w, w)
                self.min_template_h = min(self.min_template_h, h)
                
                # 存儲(chǔ)模板元數(shù)據(jù)
                self.templates.append({
                    "image": template_img,    # 模板圖像對(duì)象
                    "name": path.split("/")[-1].split(".")[0],  # 提取數(shù)字名稱
                    "path": path,             # 完整文件路徑
                    "width": w,               # 模板寬度
                    "height": h               # 模板高度
                })
                print(f"成功加載 {w}x{h} 模板: {path}")
            except Exception as e:
                print(f"加載失敗: {path} ({str(e)})")
        print("=========================n")

# ******************** 主程序流程 ********************
template_loader = TemplateLoader()  # 實(shí)例化模板加載器
clock = time.clock()                # 創(chuàng)建幀率計(jì)算器

while True:
    clock.tick()  # 開始幀計(jì)時(shí)
    # 圖像采集與預(yù)處理
    img = sensor.snapshot().lens_corr(strength=1.8)  # 捕獲圖像并校正鏡頭畸變
    
    # 階段1:矩形檢測(cè)與預(yù)處理
    rects = img.find_rects(threshold=RECT_THRESHOLD)  # 查找所有矩形區(qū)域
    
    for rect in rects:
        x, y, w, h = rect.rect()  # 提取矩形坐標(biāo)和尺寸
        
        # 區(qū)域過(guò)濾(尺寸+面積雙重校驗(yàn))
        if (w < MIN_RECT_WIDTH or h < MIN_RECT_HEIGHT or
            w * h < MIN_RECT_WIDTH * MIN_RECT_HEIGHT):
            continue  # 跳過(guò)過(guò)小區(qū)域
        
        # ROI安全邊界處理(防止越界訪問(wèn))
        img_w, img_h = img.width(), img.height()
        roi_x = max(0, x)              # 左邊界保護(hù)
        roi_y = max(0, y)              # 上邊界保護(hù)
        roi_w = min(w, img_w - roi_x)  # 寬度邊界保護(hù)
        roi_h = min(h, img_h - roi_y)  # 高度邊界保護(hù)

        # 繪制矩形標(biāo)記(輪廓+角點(diǎn))
        img.draw_rectangle(x, y, w, h, color=TEXT_COLOR)  # 繪制矩形框
        for (cx, cy) in rect.corners():  # 繪制四個(gè)角點(diǎn)
            img.draw_circle(int(cx), int(cy), 3, color=TEXT_COLOR)
        
        # 階段2:模板匹配 - 找出相似度最高的模板
        best_match = None       # 存儲(chǔ)最佳匹配結(jié)果
        best_similarity = 0.0   # 最高相似度記錄
        best_name = None        # 對(duì)應(yīng)模板名稱
        
        for template in template_loader.templates:
            # 動(dòng)態(tài)尺寸校驗(yàn)(ROI必須大于等于模板尺寸)
            if roi_w < template["width"] or roi_h < template["height"]:
                continue  # 跳過(guò)尺寸不匹配的模板
            
            try:
                # 執(zhí)行模板匹配(核心算法)
                result = img.find_template(
                    template["image"],      # 模板圖像
                    MATCH_THRESHOLD,        # 相似度閾值
                    roi=(roi_x, roi_y, roi_w, roi_h)  # 搜索區(qū)域
                )
                
                # 結(jié)果處理
                if result:
                    rx, ry, rw, rh = result  # 解包匹配結(jié)果坐標(biāo)
                    similarity = MATCH_THRESHOLD  # 使用閾值作為相似度基準(zhǔn)值
                    if similarity > best_similarity:
                        best_similarity = similarity
                        best_match = (rx, ry, rw, rh)
                        best_name = template["name"]
            
            except Exception as e:
                print(f"模板匹配出錯(cuò): {str(e)}")  # 異常捕獲

        # 結(jié)果可視化與輸出
        if best_match:
            rx, ry, rw, rh = best_match
            # 繪制匹配區(qū)域框
            img.draw_rectangle(rx, ry, rw, rh, color=TEXT_COLOR)
            # 計(jì)算文本位置(防越界)
            text_y = ry - TEXT_OFFSET if ry > TEXT_OFFSET else 0
            # 繪制識(shí)別結(jié)果文本
            img.draw_string(rx, text_y, best_name,
                            color=TEXT_COLOR,
                            scale=1,        # 字體大小
                            mono_space=True # 等寬字體
                           )
            
            # 增強(qiáng)數(shù)據(jù)輸出(帶時(shí)間戳和坐標(biāo)信息)
            print("[{:.0f}] 區(qū)域[{},{} {}x{}] 識(shí)別到{} 相似度{:.2f} 位置({},{})".format(
                time.ticks_ms(),        # 時(shí)間戳
                x, y, w, h,             # 原始區(qū)域信息
                best_name,              # 識(shí)別結(jié)果
                best_similarity,        # 匹配度
                rx + rw // 2,           # 中心X坐標(biāo)
                ry + rh // 2            # 中心Y坐標(biāo)
            ))

    # 性能顯示(右上角FPS計(jì)數(shù)器)
    img.draw_string(5, 5, "FPS:%.1f" % clock.fps(), color=TEXT_COLOR)
  • 聯(lián)系方式.txt
    下載

相關(guān)推薦

方案定制

去合作
方案開發(fā)定制化,2000+方案商即時(shí)響應(yīng)!