《DNK210使用指南 -CanMV版 V1.0》第三十六章 image影像色塊追蹤實驗

正点原子發表於2024-11-08

第三十六章 image影像色塊追蹤實驗

1)實驗平臺:正點原子DNK210開發板

2)章節摘自【正點原子】DNK210使用指南 - CanMV版 V1.0

3)購買連結:https://detail.tmall.com/item.htm?&id=782801398750

4)全套實驗原始碼+手冊+影片下載地址:http://www.openedv.com/docs/boards/k210/ATK-DNK210.html

5)正點原子官方B站:https://space.bilibili.com/394620890

6)正點原子K210技術交流企鵝群:605557868

在上一章節中,介紹了image模組中影像特徵檢測方法給的使用,本章將繼續介紹image模組中影像色塊追蹤方法的使用。透過本章的學習,讀者將學習到image模組中影像色塊追蹤的使用。
本章分為如下幾個小節:
36.1 image模組影像色塊追蹤方法介紹
36.2 硬體設計
36.3 程式設計
36.4 執行驗證

36.1 image模組影像色塊追蹤方法介紹
image模組為Image物件提供了find_blobs()方法,用於查詢影像中的所有色塊,find_blobs()方法如下所示:

image.find_blobs(thresholds, invert=False, roi, x_stride=2, y_stride=1, area_threshold=10, pixels_threshold=10, 
merge=False, margin=0, threshold_cb, merge_cb)

find_blobs()方法用於根據指定的顏色閾值查詢影像中的所有色塊,並返回image.blob物件列表。
thresholds指的是顏色閾值,該引數必須是元組列表,對於灰度圖,每個閾值元組需包含兩個值,分別為最小灰度值和最大灰度值,對於RGB565影像,每個閾值元組需要包含六個值,分別是LAB色彩空間下,L、A、B三個通道的最大值和最小值,若要追蹤多種顏色的色塊,可以在閾值元組列表中傳入多個閾值元組。
invert指的是是否對閾值進行翻轉操作,閾值翻轉後,將追蹤閾值之外的色塊。
roi指的是對Image物件感興趣的區域,若未指定,即為影像矩形。
x_stride和y_stride指的是影像處理時需要跳過的X和Y畫素的數量,若已知被檢測色塊較大,可以增加該引數。
area_threshold指的是邊界框區域閾值,邊界框區域小於該引數的色塊將會被過濾。
pixels_threshold指的是畫素數量閾值,畫素數量小於該引數的速快將會被過濾。
merge指的是是否合併邊緣矩形相互交錯重重疊且沒有被過濾的色塊。
margin指的是增大或減小相較測試用色塊邊界矩形的大小。
threshold_cb指的是閾值過濾的回撥函式,該函式會接收到被過濾色塊的image.blob物件,並透過返回True來保留色塊,透過返回False來過濾色塊。
merge_cb指的是色塊合併回撥函式,該函式會接收到兩個即將被合併的色塊的image.blob物件,並透過返回True來合併色塊,透過返回False來禁止色塊合併。
find_blobs()方法會返回image.blobs物件列表。
find_blobs()方法的使用示例如下所示:

import image
img = image.Image(size=(320, 240))
threshold = (8, 63, 8, 49, -77, -36)
blobs = img.find_blobs([threshold], False, (0, 0, img.width(), img.height()), x_stride=2, y_stride=1, 
area_threshold=10, pixels_threshold=10, merge=True, margin=10)
for b in blobs:
    img.draw_rectangle(b.rect(), color=(255, 0, 0))

關於顏色閾值的設定,CanMVIDE軟體提供了“閾值編輯器”工具,可以方便地獲取到想要的閾值。透過依次點選CanMV IDE軟體上方工具欄中的“工具”à“機器視覺”à“閾值編輯器”,即可開啟“閾值編輯器”工具,開啟時會提示需要匯入一張源影像,可以直接使用“幀緩衝區”視窗中的影像,也可以從本地檔案系統中選取,如下圖所示:

圖36.1.1 開啟“閾值編輯器”工具

選好源影像後,便會自動開啟“閾值編輯器”工具視窗,接著便可透過提供的一些選項列表和滑塊來調整需要的閾值,如下圖所示:

圖36.1.2 “閾值編輯器”工具視窗

36.2 硬體設計
36.2.1 例程功能

  1. 獲取攝像頭輸出的影像,並使用image模組對影像進行色塊追蹤,追蹤到色塊後將其框出,最後將影像顯示在LCD上。

36.2.2 硬體資源
本章實驗內容,主要講解image模組的使用,無需關注硬體資源。

36.2.3 原理圖
本章實驗內容,主要講解image模組的使用,無需關注原理圖。

36.3 程式設計
36.3.1 image模組影像色塊追蹤方法介紹
有關image模組影像色塊追蹤方法的介紹,請見第36.1小節《image模組影像色塊追蹤方法介紹》。

36.3.2 程式流程圖

圖36.3.2.1image影像色塊追蹤實驗流程圖

36.3.3 main.py程式碼
main.py中的指令碼程式碼如下所示:

import lcd
import sensor
import gc
lcd.init()
sensor.reset()
sensor.set_framesize(sensor.QVGA)
sensor.set_pixformat(sensor.RGB565)
sensor.set_hmirror(False)
sensor.set_auto_gain(False, gain_db=6.0)
sensor.set_auto_whitebal(False)
while True:
    img= sensor.snapshot()
    # 色塊追蹤
   threshold = (7, 63, -21, 46, -71, -23)
   blobs = img.find_blobs([threshold], False, (0, 0, img.width(), img.height()), x_stride=2, y_stride=1, 
area_threshold=10, pixels_threshold=10, merge=True, margin=10)
    for b in blobs:
       img.draw_rectangle(b.rect(), color=(255, 0, 0))
    lcd.display(img)
    gc.collect()

可以看到一開始是先初始化了LCD和攝像頭,並且需要注意的是,在進行色塊追蹤時,需要關閉攝像頭的自動增益和自動白平衡,才能得到更好的效果。
接著在一個迴圈中不斷地獲取攝像頭輸出的影像,因為獲取到的影像就是Image物件,因此可以直接呼叫image模組為Image物件提供的各種方法,然後就是對影像進行色塊追蹤,並將其在影像中框出,最後在LCD顯示影像。

36.4 執行驗證
將DNK210開發板連線CanMV IDE,點選CanMV IDE上的“開始(執行指令碼)”按鈕後,便能看到LCD上顯示了攝像頭輸出的影像,並且指定顏色閾值的色塊也被框了出來,如下圖所示:

圖36.4.1 框出追蹤到的色塊

相關文章