• 方案介紹
  • 附件下載
  • 相關推薦
申請入駐 產業(yè)圖譜

3.5.2-5-識別可能的色塊的區(qū)域縮放-到和模板大小一樣 openmv 數(shù)字識別 模板匹配

04/11 08:32
789
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

聯(lián)系方式.txt

共1個文件

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


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

??痮penmv視覺文章鏈接:
https://blog.csdn.net/qq_46187594/category_12900902.html

5-識別可能的色塊的區(qū)域縮放-到和模板大小一樣

下面的思路和程序參考程歡歡大佬的作品(大佬視頻中使用的他的板子,所以程序是想要修改的 下面會提供修改好的,還有大佬是使用PS整理的想要模板,后面我會演示使用更簡單的方法.視頻里面也有對優(yōu)化思路的講解可以看一下): https://www.bilibili.com/video/BV1G3411t7HX/?share_source=copy_web&vd_source=f5d5850ab773377dff308188468fbc77

程序思路:

先找色塊找到可能是數(shù)字的黑色色塊,

做縮放把黑色色塊尺寸縮放到和模板一樣,

簡單方法制作統(tǒng)一40像素模板:

使用QQ或者微信等截圖工具把之前1-8數(shù)字截圖小一些,如下數(shù)字整個剛剛在框里面
在這里插入圖片描述
然后使用win10系統(tǒng)自帶的編輯圖片工具打開(win10是畫圖工具這個軟件,不確定win7或者win11里面編輯圖片的有這個功能,如果沒有自行下載ps等更專業(yè)軟件學習如何修改大小)
在這里插入圖片描述
然后使用轉化網(wǎng)站,把剛剛的jpg格式轉成為pgm,可以使用的網(wǎng)站如下(如果都能用了,自行百度搜索一個可以的,如果網(wǎng)站讓你設置大小等你無需設置讓他保持默認大小就行)JPG 到 PGM - 將您的 JPG 轉換為 PGM 的在線工具

JPG轉PGM批量轉換器 | 線上 免費

把處理的好的復制到openmv里面
在這里插入圖片描述
然后下面是程序

下面的程序會有一些問題,在較新版固件比如4.5.9上 執(zhí)行下面代碼顯示在openmv IDE幀緩沖區(qū)的圖像沒有把數(shù)字圈出來(通過觀察串行端口 發(fā)現(xiàn)也已經(jīng)識別到了數(shù)字),而使用4.4.1固件數(shù)字會被圈出來也就是說openmv IDE顯示的是處理繪制的圖像。

# -*- coding: utf-8 -*-
"""
OpenMV數(shù)字識別程序(彩色顯示版)
功能:識別攝像頭中的數(shù)字并用紅色字體標注
特點:保持灰度處理流程,最終輸出彩色標注畫面
"""

# *************************** 硬件初始化部分 ***************************
# 導入機器視覺庫和時鐘模塊
import sensor, image, time

# 初始化攝像頭硬件
sensor.reset()  # 復位攝像頭硬件,清空初始化參數(shù)
# 設置攝像頭采集模式(核心參數(shù)設置)
sensor.set_pixformat(sensor.RGB565)  # 設置為彩色模式(16位RGB,每個像素2字節(jié))
sensor.set_framesize(sensor.QQVGA)   # 分辨率160x120(用于保證處理速度)
sensor.set_contrast(3)               # 設置對比度+3(增強明暗對比,提升識別率)

# *************************** 圖像鏡像設置 ***************************
# (根據(jù)攝像頭物理安裝方向調整,不需要可注釋)
sensor.set_vflip(True)   # 垂直翻轉:適用于攝像頭倒置安裝的情況
sensor.set_hmirror(True) # 水平鏡像:適用于需要鏡像顯示的場景

# *************************** 數(shù)字模板配置 ***************************
num_quantity = 8    # 定義要識別的數(shù)字范圍(1-8)
num_model = []       # 創(chuàng)建空列表存儲模板圖像

# 加載預存數(shù)字模板(需提前準備1.pgm~8.pgm文件)
for n in range(1, num_quantity+1):
    # 加載PGM格式模板(建議使用白底黑字40像素高度圖片)
    num_model.append(image.Image(str(n) + '.pgm'))  # 將模板圖像存入列表

# *************************** 性能監(jiān)測配置 ***************************
clock = time.clock()  # 創(chuàng)建幀率計算時鐘對象

# *************************** 圖像緩沖區(qū)配置 ***************************
# 分配模板匹配專用緩沖區(qū)(優(yōu)化處理速度)
img_to_matching = sensor.alloc_extra_fb(35, 45, sensor.GRAYSCALE)  # 35x45灰度緩沖區(qū)
# 說明:該緩沖區(qū)用于存儲縮放后的待匹配區(qū)域圖像

# *************************** 算法參數(shù)設置 ***************************
threshold = (0, 70)  # 灰度閾值范圍:0-70(用于檢測深色數(shù)字區(qū)域)
scale = 1            # 圖像縮放比例初始化值

# *************************** 主循環(huán)處理邏輯 ***************************
while(True):
    # 【階段1】幀率計算與圖像采集
    clock.tick()  # 開始幀計時(必須在循環(huán)開頭調用)
    img = sensor.snapshot()  # 捕獲一幀RGB565彩色圖像(160x120像素)
    
    # 【階段2】創(chuàng)建灰度處理副本
    img_gray = img.to_grayscale(copy=True)  # 生成灰度副本(保持原圖不變)
    # 注意:所有圖像處理操作在灰度副本上進行以保證算法穩(wěn)定性
    
    # 【階段3】色塊檢測
    blobs = img_gray.find_blobs([threshold])  # 在灰度圖像中查找符合閾值的色塊
    
    # 【階段4】候選區(qū)域處理
    if blobs:  # 如果檢測到有效色塊
        # 遍歷所有檢測到的色塊(blobs對象包含多個blob)
        for blob in blobs:
            # 色塊有效性過濾條件(排除噪聲干擾)
            if blob.pixels() > 50 and 100 > blob.h() > 10 and blob.w() > 3:
                # 【步驟4.1】在彩色圖像上繪制檢測框
                # 繪制綠色預備框(比實際區(qū)域大4像素)
                img.draw_rectangle(
                    blob.x()-2, blob.y()-2,  # 起點坐標(左上角)
                    blob.w()+4, blob.h()+4,   # 框體尺寸(寬度+高度)
                    color=(0, 255, 0)        # 顏色:純綠色
                )
                # 在色塊左上角顯示當前縮放比例(調試信息,白色文字)
                img.draw_string(blob[0], blob[1], str(round(scale, 2)), color=(255, 255, 255))
                
                # 【步驟4.2】計算縮放比例
                scale = 40 / blob.h()  # 根據(jù)色塊高度計算縮放比例(模板高度為40像素)
                
                # 【步驟4.3】提取待匹配區(qū)域
                img_to_matching.draw_image(
                    img_gray,  # 源圖像(使用灰度副本保證處理一致性)
                    0, 0,     # 目標位置(緩沖區(qū)左上角)
                    roi=(  # 源圖像感興趣區(qū)域(Region of Interest)
                        blob.x()-2,      # x起點(左擴2像素)
                        blob.y()-2,      # y起點(上擴2像素)
                        blob.w()+4,      # 寬度(左右各擴2像素)
                        blob.h()+4       # 高度(上下各擴2像素)
                    ),
                    x_scale=scale,  # 水平縮放比例
                    y_scale=scale   # 垂直縮放比例
                )
                
                # 【階段5】模板匹配識別
                # 遍歷所有數(shù)字模板進行匹配
                for n in range(0, num_quantity):
                    # 執(zhí)行模板匹配(核心識別函數(shù))
                    r = img_to_matching.find_template(
                        num_model[n],  # 當前數(shù)字模板(n對應數(shù)字1-8)
                        0.7,           # 相似度閾值(0.0-1.0,越大匹配越嚴格)
                        step=2,        # 搜索步長(2表示隔行掃描,加快速度)
                        search=image.SEARCH_EX  # 搜索模式:窮舉搜索(精度最高)
                    )
                    
                    if r:  # 如果匹配結果有效(相似度超過閾值)
                        # 【步驟5.1】在彩色圖像上繪制橙色確認框
                        img.draw_rectangle(
                            blob[0:4],          # 矩形參數(shù)(x,y,w,h)
                            color=(255, 100, 0) # 橙色邊框(BGR格式)
                        )
                        # 【步驟5.2】顯示識別結果(核心修改點)
                        img.draw_string(
                            blob[0], blob[1],   # 顯示位置(色塊左上角)
                            str(n+1),          # 顯示內容(識別到的數(shù)字)
                            scale=5,            # 字體放大倍數(shù)(原始5倍)
                            color=(255, 0, 0)   # 字體顏色:純紅色(BGR格式)
                        )
                        # 【新增】輸出識別結果:數(shù)字ID,X坐標,Y坐標
                        print("DETECT: num={}, x={}, y={}".format(n+1, blob.cx(), blob.cy()))
    
    # 【階段6】顯示幀率信息
    # 在畫面左上角顯示當前幀率(白色文字)
    img.draw_string(0, 0, str(round(clock.fps(), 2)), color=(255, 255, 255))

# *************************** 注意事項 ***************************
"""
1. 必須準備數(shù)字模板:在存儲卡根目錄放置1.pgm~8.pgm文件
2. 模板建議規(guī)格:白底黑字、高度40像素、PGM格式
3. 實際顯示效果:
   - 綠色框:初步檢測區(qū)域
   - 橙色框:成功匹配區(qū)域
   - 紅色數(shù)字:識別結果
   - 白色文字:幀率信息
4. 性能參數(shù):QQVGA分辨率下典型幀率15-30fps(取決于處理復雜度)
5. 調試技巧:可通過調整threshold閾值和scale計算優(yōu)化識別效果
"""

下面的代碼 解決顯示問題:

使用img.copy 可以復制一份圖像方便openmv IDE顯示和后面處理圖像

img_copy = img.copy()#img復制到img_copy上一份 兩個參數(shù)分別是

# -*- coding: utf-8 -*-
"""
OpenMV數(shù)字識別程序(彩色顯示版)
功能:識別攝像頭中的數(shù)字并用紅色字體標注
特點:保持灰度處理流程,最終輸出彩色標注畫面
"""

# *************************** 硬件初始化部分 ***************************
# 導入機器視覺庫和時鐘模塊
import sensor, image, time

# 初始化攝像頭硬件
sensor.reset()  # 復位攝像頭硬件,清空初始化參數(shù)
# 設置攝像頭采集模式(核心參數(shù)設置)
sensor.set_pixformat(sensor.RGB565)  # 設置為彩色模式(16位RGB,每個像素2字節(jié))
sensor.set_framesize(sensor.QQVGA)   # 分辨率160x120(用于保證處理速度)
sensor.set_contrast(3)               # 設置對比度+3(增強明暗對比,提升識別率)

# *************************** 圖像鏡像設置 ***************************
# (根據(jù)攝像頭物理安裝方向調整,不需要可注釋)
sensor.set_vflip(True)   # 垂直翻轉:適用于攝像頭倒置安裝的情況
sensor.set_hmirror(True) # 水平鏡像:適用于需要鏡像顯示的場景

# *************************** 數(shù)字模板配置 ***************************
num_quantity = 8    # 定義要識別的數(shù)字范圍(1-8)
num_model = []       # 創(chuàng)建空列表存儲模板圖像

# 加載預存數(shù)字模板(需提前準備1.pgm~8.pgm文件)
for n in range(1, num_quantity+1):
    # 加載PGM格式模板(建議使用白底黑字40像素高度圖片)
    num_model.append(image.Image(str(n) + '.pgm'))  # 將模板圖像存入列表

# *************************** 性能監(jiān)測配置 ***************************
clock = time.clock()  # 創(chuàng)建幀率計算時鐘對象

# *************************** 圖像緩沖區(qū)配置 ***************************
# 分配模板匹配專用緩沖區(qū)(優(yōu)化處理速度)
img_to_matching = sensor.alloc_extra_fb(35, 45, sensor.GRAYSCALE)  # 35x45灰度緩沖區(qū)
# 說明:該緩沖區(qū)用于存儲縮放后的待匹配區(qū)域圖像

# *************************** 算法參數(shù)設置 ***************************
threshold = (0, 70)  # 灰度閾值范圍:0-70(用于檢測深色數(shù)字區(qū)域)
scale = 1            # 圖像縮放比例初始化值

# *************************** 主循環(huán)處理邏輯 ***************************
while(True):
    # 【階段1】幀率計算與圖像采集
    clock.tick()  # 開始幀計時(必須在循環(huán)開頭調用)
    img = sensor.snapshot()  # 捕獲一幀RGB565彩色圖像(160x120像素)
    
    img_copy = img.copy()#img復制到img_copy上一份 兩個參數(shù)分別是 
    #這樣操作更方便后面 openmvIDE幀緩沖區(qū)顯示的是img 圖像,后面如果比如訓練可以使用彩色的img_copy 進行循跡
    # 【階段2】創(chuàng)建灰度處理副本
    #img_gray = img.to_grayscale(copy=True, allocator=image.ALLOCATOR_CB)
    img_gray = img_copy.to_grayscale(copy=True)  # 生成灰度副本(保持原圖不變)
    # 注意:所有圖像處理操作在灰度副本上進行以保證算法穩(wěn)定性
    
    # 【階段3】色塊檢測
    blobs = img_gray.find_blobs([threshold])  # 在灰度圖像中查找符合閾值的色塊
    
    # 【階段4】候選區(qū)域處理
    if blobs:  # 如果檢測到有效色塊
        # 遍歷所有檢測到的色塊(blobs對象包含多個blob)
        for blob in blobs:
            # 色塊有效性過濾條件(排除噪聲干擾)
            if blob.pixels() > 50 and 100 > blob.h() > 10 and blob.w() > 3:
                # 【步驟4.1】在彩色圖像上繪制檢測框
                # 繪制綠色預備框(比實際區(qū)域大4像素)
                img.draw_rectangle(
                    blob.x()-2, blob.y()-2,  # 起點坐標(左上角)
                    blob.w()+4, blob.h()+4,   # 框體尺寸(寬度+高度)
                    color=(0, 255, 0)        # 顏色:純綠色
                )
                # 在色塊左上角顯示當前縮放比例(調試信息,白色文字)
                img.draw_string(blob[0], blob[1], str(round(scale, 2)), color=(255, 255, 255))
                
                # 【步驟4.2】計算縮放比例
                scale = 40 / blob.h()  # 根據(jù)色塊高度計算縮放比例(模板高度為40像素)
                
                # 【步驟4.3】提取待匹配區(qū)域
                img_to_matching.draw_image(
                    img_gray,  # 源圖像(使用灰度副本保證處理一致性)
                    0, 0,     # 目標位置(緩沖區(qū)左上角)
                    roi=(  # 源圖像感興趣區(qū)域(Region of Interest)
                        blob.x()-2,      # x起點(左擴2像素)
                        blob.y()-2,      # y起點(上擴2像素)
                        blob.w()+4,      # 寬度(左右各擴2像素)
                        blob.h()+4       # 高度(上下各擴2像素)
                    ),
                    x_scale=scale,  # 水平縮放比例
                    y_scale=scale   # 垂直縮放比例
                )
                
                # 【階段5】模板匹配識別
                # 遍歷所有數(shù)字模板進行匹配
                for n in range(0, num_quantity):
                    # 執(zhí)行模板匹配(核心識別函數(shù))
                    r = img_to_matching.find_template(
                        num_model[n],  # 當前數(shù)字模板(n對應數(shù)字1-8)
                        0.7,           # 相似度閾值(0.0-1.0,越大匹配越嚴格)
                        step=2,        # 搜索步長(2表示隔行掃描,加快速度)
                        search=image.SEARCH_EX  # 搜索模式:窮舉搜索(精度最高)
                    )
                    
                    if r:  # 如果匹配結果有效(相似度超過閾值)
                        # 【步驟5.1】在彩色圖像上繪制橙色確認框
                        img.draw_rectangle(
                            blob[0:4],          # 矩形參數(shù)(x,y,w,h)
                            color=(255, 100, 0) # 橙色邊框(BGR格式)
                        )
                        # 【步驟5.2】顯示識別結果(核心修改點)
                        img.draw_string(
                            blob[0], blob[1],   # 顯示位置(色塊左上角)
                            str(n+1),          # 顯示內容(識別到的數(shù)字)
                            scale=5,            # 字體放大倍數(shù)(原始5倍)
                            color=(255, 0, 0)   # 字體顏色:純紅色(BGR格式)
                        )
                        # 【新增】輸出識別結果:數(shù)字ID,X坐標,Y坐標
                        print("DETECT: num={}, x={}, y={}".format(n+1, blob.cx(), blob.cy()))

    # 【階段6】顯示幀率信息
    # 在畫面左上角顯示當前幀率(白色文字)
    img.draw_string(0, 0, str(round(clock.fps(), 2)), color=(255, 255, 255))

  • 聯(lián)系方式.txt
    下載

相關推薦

方案定制

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