《DNK210使用指南 -CanMV版 V1.0》第二十六章 攝像頭影像捕獲實驗

正点原子發表於2024-09-25

第二十六章 攝像頭影像捕獲實驗

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

本章將介紹CanMV下攝像頭的使用,能透過攝像頭實時地採集攝像頭捕獲到的影像資料,從而進行進一步的處理。透過本章的學習,讀者將學習到透過CanMV驅動攝像頭實時捕獲影像資料。
本章分為如下幾個小節:
26.1 sensor模組介紹
26.2 硬體設計
26.3 程式設計
26.4 執行驗證

26.1 sensor模組介紹
sensor模組是CanMV內建的模組,sensor模組用於驅動攝像頭,能夠對攝像頭進行配置並進行影像資料的捕獲,從而實現一些拍攝任務。
sensor模組提供了reset()函式,用於重置並初始化攝像頭,reset()函式如下所示:

sensor.reset(freq=24000000, set_regs=True, choice=0, dual_buff=False)

reset()函式用於重置並初始化攝像頭,該函式能夠自動識別接入的且被支援的攝像頭型別,並根據不同的攝像頭進行不同的重置並初始化操作.
freq指的是攝像頭畫素時鐘的頻率,若該引數為空,則使用預設的24MHz。
set_regs指的是否讓程式在初始化攝像頭的過程中配置攝像頭的暫存器,若開發者希望使用另外的暫存器配置方式初始化攝像頭,可以將該引數配置為False,然後使用相應的暫存器配置函式自行配置攝像頭的暫存器,該引數預設為True。
choice指的是接入的攝像頭的型別,可選的引數如下表所示:

表26.1.1 choice可選引數描述

dual_buff指的是是否使能攝像頭的雙緩衝模式,當為True時,將使能雙緩衝模式,此時sensor模組會為攝像頭的幀緩衝分配兩個大小均為幀大小的緩衝區,因此會更加佔用記憶體,但好處是攝像頭的捕獲幀率在某些情況下可能會有所提升,當為False時,將禁用雙緩衝模式,此時sensor模組將只會為攝像頭的幀緩衝分配一個大小為幀大小的緩衝區,因此會更加地節省記憶體。
reset()函式的使用示例如下所示:

import sensor
sensor.reset()

sensor模組提供了set_framesize()函式,用於配置攝像頭輸出的幀大小,set_framesize()函式如下所示:

sensor.set_framesize(framesize, set_regs=True)

set_framesize()函式用於配置攝像頭輸出的幀大小,也就是輸出影像的畫素解析度,由於Kendryte K210的DVP最大支援的幀大小為640*480,因此攝像頭輸出的幀大小不應該超出這個值。
framesize指的是要配置的幀大小,可選的引數如下所示:


表26.1.2 framesize可選引數

set_regs指的是是否讓程式在配置攝像頭驅動程式時,根據所配置的幀大小配置攝像頭的暫存器,若開發者希望自行配置攝像頭的暫存器,可以將該引數配置為False,該引數預設為True。
set_framesize()函式的使用示例如下所示:

import sensor
sensor.reset()
sensor.set_framesize(sensor.QVGA)

sensor模組提供了set_pixformat()函式,用於配置攝像頭輸出影像的畫素格式,set_pixformat()函式如下所示:

sensor.set_pixformat(format, set_regs)

set_pixformat()函式用於配置攝像頭輸出影像的畫素格式,由於DNK210開發板上的LCD螢幕使用的是RGB565的畫素格式,因此推薦配置攝像頭輸出影像的畫素格式也是RGB565.
format指的是要配置的影像畫素格式,可選的引數如下所示:

表26.1.3 format可選引數

set_regs指的是是否讓程式在配置攝像頭驅動程式時,根據所配置的畫素格式配置攝像頭的暫存器,若開發者希望自行配置攝像頭的暫存器,可以將該引數配置為False,該引數預設為True。
set_pixformat()函式的使用示例如下所示:

import sensor
sensor.reset()
sensor.set_pixformat(sensor.RGB565)

sensor模組提供了snapshot()函式,用於獲取攝像頭捕獲到的影像資料,snapshot()函式如下所示:

sensor.snapshot(update_jb=True)

snapshot()函式用於獲取攝像頭捕獲到的影像資料,並返回一個Image物件。
update_jb指的是是否將捕獲到的影像資料上傳到CanMV IDE軟體,當為True時,snapshot()函式捕獲到的影像資料會被進行JPEG編碼壓縮後上傳到CanMV IDE軟體,這麼一來便能在CanMV IDE軟體的“幀緩衝區”視窗中看到snapshot()函式捕獲到的影像資料,當為False時,snpshot()函式捕獲到的影像資料不會被上傳到CanMV IDE軟體,這樣的好處是,當與CanMV IDE軟體連線時不用進行JPEG編碼壓縮以及影像資料上傳的任務,從而降低CPU的使用率。
snapshot()函式的使用示例如下所示:

import sensor
sensor.reset()
sensor.set_framesize(sensor.QVGA)
sensor.set_pixformat(sensor.RGB565)
img = sensor.snapshot()

sensor模組提供了set_hmirror()函式,用於使能攝像頭輸出影像的水平映象操作,set_hmirror()函式如下所示:

sensor.set_hmirror(enable)

set_hmirror()函式用於使能攝像頭輸出影像的水平映象操作。
enable指的是是否使能攝像頭輸出影像的水平映象功能,當為True時,使能攝像頭輸出影像的水平映象功能,當為False時,禁止攝像頭輸出影像的水平映象功能。
set_hmirror()函式的使用示例如下所示:

import sensor
sensor.reset()
sensor.set_framesize(sensor.QVGA)
sensor.set_pixformat(sensor.RGB565)
sensor.set_hmirror(False)
img = sensor.snapshot()

sensor模組提供了set_vflip()函式,用於使能攝像頭輸出影像的垂直翻轉操作,set_vflip()函式如下所示:

sensor.set_vflip(enable)

set_vflip()函式用於使能攝像頭輸出影像的垂直翻轉操作。
enable指的是是否使能攝像頭輸出影像的垂直翻轉功能,當為True時,使能攝像頭輸出影像的垂直翻轉功能,當為False時,禁止攝像頭輸出影像的垂直翻轉功能。
set_vflip()函式的使用示例如下所示:

import sensor
sensor.reset()
sensor.set_framesize(sensor.QVGA)
sensor.set_pixformat(sensor.RGB565)
sensor.set_vflip(False)
img = sensor.snapshot()

sensor模組提供了set_jb_quality()函式,用於配置上傳到CanMV IDE軟體的JPEG影像的質量,set_jb_quality()函式如下所示:

sensor.set_jb_quality(quality=35)

set_jb_quality()函式用於配置上傳到CanMV IDE軟體的JPEG影像的質量,因為上傳到CanMVIDE軟體的影像會被先壓縮成JPEG格式在進行上傳,JPEG壓縮時可以配置JPEG壓縮的質量,這個質量越高壓縮的程度越小,畫面越精細,但壓縮出來的JPEG影像體積也越大,反之如果JPEG壓縮時配置的JPEG壓縮質量越低,則壓縮的程度越大,畫面越粗糙,但壓縮出來的JPEG影像體積也越小。
quality指的時JPEG影像壓縮式的質量,範圍為[0,100]。
set_jb_quality()函式的使用示例如下所示:

import sensor
sensor.reset()
sensor.set_framesize(sensor.QVGA)
sensor.set_pixformat(sensor.RGB565)
sensor.set_hmirror(False)
sensor.set_jb_quality(35)
img = sensor.snapshot()

sensor模組提供了set_contrast()函式,用於配置攝像頭輸出影像的對比度,set_contrast()函式如下所示:

sensor.set_contrast(contrast)

set_contrast()函式用於配置攝像頭輸出影像的對比度。
contrast指的是對比度的值,範圍為[-2, 2]
set_contrast()函式的使用示例如下所示:

import sensor
sensor.reset()
sensor.set_framesize(sensor.QVGA)
sensor.set_pixformat(sensor.RGB565)
sensor.set_hmirror(False)
sensor.set_contrast(0)
img = sensor.snapshot()

sensor模組提供了set_brightness()函式,用於配置攝像頭輸出影像的亮度,set_brightness()函式如下所示:

sensor.set_brightness(brightness)

set_brightness()函式用於配置攝像頭輸出影像的亮度。
brightness指的是亮度的值,範圍為[-2, 2]
set_brightness()函式的使用示例如下所示:

import sensor
sensor.reset()
sensor.set_framesize(sensor.QVGA)
sensor.set_pixformat(sensor.RGB565)
sensor.set_hmirror(False)
sensor.set_brightness(0)
img = sensor.snapshot()

sensor模組提供了set_saturation()函式,用於配置攝像頭輸出影像的飽和度,set_saturation()函式如下所示:

sensor.set_saturation(saturation)

set_saturation()函式用於配置攝像頭輸出影像的飽和度。
saturation指的是飽和度的值,範圍為[-2, 2]
set_saturation()函式的使用示例如下所示:

import sensor
sensor.reset()
sensor.set_framesize(sensor.QVGA)
sensor.set_pixformat(sensor.RGB565)
sensor.set_hmirror(False)
sensor.set_saturation(0)
img = sensor.snapshot()

sensor模組提供了set_auto_gain()函式,用於配置攝像頭自動增益,set_auto_gain()函式如下所示:

sensor.set_auto_gain(enable, gain_db, gain_db_ceiling)

set_auto_gain()函式用於配置攝像頭的自動增益以及自動增益的上限值等。
enable指的是是否使能攝像頭的自動增益,當為True時,使能攝像頭的自動增益,當為False時,則不是能攝像頭的自動增益。
gain_db指的是當不是能攝像頭的自動增益時,設定的固定增益值,單位為dB,需要注意的時,當需要使用顏色追蹤功能的時候,建議關閉攝像頭的自動增益。
gain_db_ceiling指的是使能攝像頭自動增益時,自動增益的上限值。
set_auto_gain()函式的使用示例如下所示:

import sensor
sensor.reset()
sensor.set_framesize(sensor.QVGA)
sensor.set_pixformat(sensor.RGB565)
sensor.set_hmirror(False)
sensor.set_auto_gain(True, gain_db=0, gain_db_ceiling=16.0)
img = sensor.snapshot()

sensor模組提供了set_auto_whitebal()函式,用於配置攝像頭的自動白平衡,set_auto_whitebal()函式如下所示:

sensor.set_auto_whitebal(enable)

set_auto_whitebal()函式用於配置攝像頭的自動白平衡。
enable指的是是否使能攝像頭的自動白平衡功能,當為True時,則使能攝像頭的自動白平衡功能,當為False時,則不使能攝像頭的自動白平衡功能。
set_auto_whitebal()函式的使用示例如下所示:

import sensor
sensor.reset()
sensor.set_framesize(sensor.QVGA)
sensor.set_pixformat(sensor.RGB565)
sensor.set_hmirror(False)
sensor.set_auto_whitebal(True)
img = sensor.snapshot()

sensor模組提供了__write_reg()函式,用於寫入攝像頭的暫存器,__write_reg()函式如下所示:

sensor.__write_reg(address, value)

sensor.__write_reg()函式用於使用SCCB介面寫入攝像頭的暫存器。
address指的是攝像頭的暫存器地址。
value指的是待寫入攝像頭暫存器的值。
__write_reg()函式的使用示例如下所示:

import sensor
sensor.reset()
sensor.__write_reg(0xFF, 0x01)

sensor模組提供了__read_reg()函式,用於讀取攝像頭的暫存器,__read_reg()函式如下所示:

sensor.__read_reg(address)

sensor.__read_reg()函式用於使用SCCB介面讀取攝像頭的暫存器,並返回讀取到的值。
address指的是攝像頭的暫存器地址。
__read_reg()函式的使用示例如下所示:

import sensor
sensor.reset()
pid = sensor.__read_reg(0x0A) << 8
pid |= sensor.__read_reg(0x0B)
print("Sensor'sproduct ID: 0x%04X" %(pid))

26.2 硬體設計
26.2.1 例程功能

  1. 使用sensor模組初始化板載的攝像頭,並配置攝像頭的輸出幀大小以及輸出格式等進行配置,最後獲取攝像頭採集到的影像資料,並在LCD以及CanMV IDE軟體的“幀緩衝區”視窗進行顯示。
    26.2.2 硬體資源
  2. 攝像頭
    SCCB_SDA- IO40
    SCCB_SCL- IO41
    DVP_RESET- IO42
    DVP_VSYNC- IO43
    DVP_PWDN- IO44
    DVP_HREF- IO45
    DVP_XCLK- IO46
    DVP_PCLK- IO47
    D0~D7- DVP_D0~DVP_D7
  3. LCD
    LCD_RD- IO34
    LCD_BL- IO35
    LCD_CS- IO36
    LCD_RST- IO37
    LCD_RS- IO38
    LCD_WR- IO39
    LCD_D0~LCD_D7- SPI0_D0~SPI0_D7
    26.2.3 原理圖
    本章實驗內容,需要使用到板載的攝像頭介面,在正點原子DNK210開發板上有兩處攝像頭介面分別為位於正點原子DNK210開發板底板上的ATK-MC2640攝像頭模組介面,該介面用於連線正點原子的ATK-MC2640模組,另一個攝像頭介面位於正點原子CNK210F核心板,該介面同於直接連線OV2640等攝像頭模組,但需要特別注意的是,這兩個攝像頭介面不能同時使用,否則可能導致硬體損壞。
    正點原子DNK210開發板上的ATK-MC2640攝像頭模組介面的連線原理圖,如下圖所示:


圖26.2.3.1ATK-MC2640攝像頭模組介面原理圖

正點原子CNK210F核心板上的OV2640等攝像頭模組介面的連線原理圖,如下圖所示:


圖26.2.3.2OV2640等攝像頭模組介面原理圖

26.3 程式設計
26.3.1 sensor模組
有關sensor模組的介紹,請見第26.1小節《sensor模組介紹》。
26.3.2 程式流程圖


圖26.3.2.1 攝像頭影像捕獲實驗流程圖

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

import lcd
import sensor
# 初始化LCD
lcd.init()
# 初始化攝像頭
sensor.reset()
# 設定攝像頭輸出幀大小
sensor.set_framesize(sensor.QVGA)
# 設定攝像頭輸出格式
sensor.set_pixformat(sensor.RGB565)
# 設定攝像頭水平映象
sensor.set_hmirror(False)
while True:
    # 獲取攝像頭輸出影像
    img= sensor.snapshot()
    # 顯示攝像頭輸出影像至LCD
    lcd.display(img)

可以看到首先對LCD和攝像頭進行了初始化。
接著是配置攝像頭輸出的幀大小以及輸出格式。
然後是針對攝像頭的擺放方向配置攝像頭進行水平映象,水平映象後後續才能在LCD和CanMV IDE軟體的“幀緩衝區”視窗中看到“較為正常”的影像畫面。
最後就是在一個迴圈中不斷地獲取攝像頭輸出的影像資料,然後將影像在LCD螢幕上進行顯示。

26.4 執行驗證
將DNK210開發板連線CanMV IDE後,點選CanMV IDE上的“開始(執行指令碼)”按鈕後,可以看到LCD上實時地顯示這攝像頭採集到的畫面,如下圖所示:


圖26.4.1 LCD顯示攝像頭採集影像

此時,若使能了CanMV IDE軟體的“幀緩衝區”視窗功能,則同時能在CanMV IDE軟體的“幀緩衝區”視窗看到攝像頭採集的影像畫面,如下圖所示:


圖26.4.2 CanMV IDE軟體“幀緩衝區”視窗顯示攝像頭採集影像

相關文章