《DNK210使用指南 -CanMV版 V1.0》第三十章 照片拍攝實驗

正点原子發表於2024-10-14

第三十章 照片拍攝實驗

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下獲取攝像頭輸出的影像資料並在LCD上進行顯示,同時也瞭解瞭如何解碼檔案系統中的影像檔案然後在LCD上進行顯示,本章將透過照片拍攝實驗,介紹如何透過CanMV將攝像頭輸出的影像資料進行影像編碼儲存到檔案系統中。透過本章的學習,讀者將學習到CanMV下影像資料的編碼儲存。
本章分為如下幾個小節:
30.1 Image物件的載入與儲存方法介紹
30.2 硬體設計
30.3 程式設計
30.4 執行驗證

30.1 Image物件的載入與儲存方法介紹

Image物件是image模組中構造的一個物件,用於表示影像。image模組是CanMV內建的模組,image模組主要用於進行影像資料的處理,在後續章節中將對image模組展開更詳細的介紹,本章主要介紹Image物件的載入與儲存方法。
image模組為Image物件提供了其Image()方法,用於使用不同的方式讀取並解碼圖片資料,並返回一個Image物件,Image方法如下所示:

image.Image(path, copy_to_fb=False)

Image方法用於讀取並解碼影像檔案或資料,並返回一個Image物件。
path指的是影像檔案的路徑,Image方法能夠自動根據影像檔案的檔名識別影像檔案的影像格式,並對其進行解碼、讀取。
copy_to_fb指的是是否將影像直接載入幀緩衝區,當為True時,影像會被直接載入幀緩衝區,此時便可以載入體積較大的影像,當為False時,影像會被載入MicroPython的堆中,但堆的大小要遠比幀緩衝區小得多。
Image方法的使用示例如下所示:

import image
img = image.Image("/sd/PICTURE/picture.jpg")

image模組為Image物件提供了save()方法,用於儲存Image物件到檔案系統中,save()方法如下所示:

image.save(path, roi, quality=50)

save()方法用於儲存Image物件到檔案系統中,save()方法會自動根據提供的路徑對影像進行編碼,然後儲存到指定的檔案中,支援的影像格式有BMP、PGM、PPM、JPG和JPEG。
path指的是影像儲存在檔案系統中的路徑。
roi指的是需要儲存的影像的區域,當儲存的影像檔案為JPEG格式時,該引數將無效。
quality指的是JPEG影像的壓縮質量,當儲存的影像格式為JPEG時,需要對影像檔案進行JPEG壓縮,壓縮質量的值越大,壓縮後的JPEG影像將儲存更多的原影像資訊,反之,若壓縮質量的值越小,壓縮後的JPEG影像將儲存更少的原影像資訊以減小檔案的體積,壓縮質量的取值範圍為[1,100]。
save()方法的使用示例如下所示:

import sensor
import image
sensor.reset()
sensor.set_framesize(sensor.QVGA)
sensor.set_pixformat(sensor.RGB565)
sensor.set_hmirror(False)
img = sensor.snapshot()
img.save("/sd/PHOTO/photo.jpg")

30.2 硬體設計

30.2.1 例程功能

  1. 實時獲取攝像頭輸出的影像資料並將其在LCD上進行顯示
  2. 當KEY0按鍵被按下後,儲存當前獲取到的攝像頭輸出影像到檔案系統中,並再將其在LCD上顯示一段時間

30.2.2 硬體資源

  1. 攝像頭
    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
  2. 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

30.2.3 原理圖
本章實驗內容,需要使用到板載的攝像頭介面,在正點原子DNK210開發板上有兩處攝像頭介面分別為位於正點原子DNK210開發板底板上的ATK-MC2640攝像頭模組介面,該介面用於連線正點原子的ATK-MC2640模組,另一個攝像頭介面位於正點原子CNK210F核心板,該介面同於直接連線OV2640等攝像頭模組,但需要特別注意的是,這兩個攝像頭介面不能同時使用,否則可能導致硬體損壞。
正點原子DNK210開發板上的ATK-MC2640攝像頭模組介面的連線原理圖,如下圖所示:

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

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

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

30.3 程式設計

30.3.1 Image物件的載入與儲存方法介紹
有關Image物件的載入與儲存方法的介紹,請見第30.1小節《Image物件的載入與儲存方法介紹》。
30.3.2 程式流程圖

圖30.3.2.1 照片拍攝實驗流程圖
30.3.3 main.py程式碼
main.py中的指令碼程式碼如下所示:

from board import board_info
from fpioa_manager import fm
from maix import GPIO
import time
import lcd
import sensor
import image
import os
try:
    os.mkdir("/sd/PHOTO")
except Exception:
    pass
# 為IO分配相應的硬體功能
fm.register(board_info.KEY0, fm.fpioa.GPIOHS0)
# 構造GPIO物件
key0 = GPIO(GPIO.GPIOHS0, GPIO.IN, GPIO.PULL_UP)
shutter = False
# 配置GPIO物件的中斷
def key_irq_handler(key):
    global key0
    global shutter
   time.sleep_ms(20)
    if key is key0 and key.value() == 0:
       shutter = True
key0.irq(key_irq_handler, GPIO.IRQ_FALLING, GPIO.WAKEUP_NOT_SUPPORT, 7)
lcd.init()
sensor.reset()
sensor.set_framesize(sensor.QVGA)
sensor.set_pixformat(sensor.RGB565)
sensor.set_hmirror(False)
while True:
    img= sensor.snapshot()
    lcd.display(img)
    if shutter is True:
       shutter = False
       # 儲存Image物件到檔案
       img.save("/sd/PHOTO/photo.jpg")
       # 從檔案建立Image物件
       photo = image.Image("/sd/PHOTO/photo.jpg")
       lcd.display(photo)
       time.sleep(2)
       del photo

可以看到首先對中斷按鍵、LCD和攝像頭進行了初始化。
接著是配置攝像頭輸出的幀大小以及輸出格式。
然後是針對攝像頭的擺放方向配置攝像頭進行水平映象,水平映象後後續才能在LCD和CanMV IDE軟體的“幀緩衝區”視窗中看到“較為正常”的影像畫面。
最後就是在一個迴圈中不斷地獲取攝像頭輸出的影像資料,然後將影像在LCD螢幕上進行顯示,同時讀取快門標誌,當快門標誌在按鍵中斷中配複製為True時,表示需要進行拍照,此時便將最近一次獲取到的攝像頭資料儲存到指定檔案中,並將其在LCD上顯示一段時間。

30.4 執行驗證

將DNK210開發板連線CanMV IDE後,點選CanMV IDE上的“開始(執行指令碼)”按鈕後,可以看到LCD上實時地顯示這攝像頭採集到的畫面,此時若按下KEY0按鍵,便會將最近一次獲取到的攝像頭資料儲存到SD卡media目錄下的photo.jpeg檔案中,如下圖所示:

圖30.4.1 拍攝到的影像

相關文章