【雕爺學編程】MicroPython動手做(06)——零基礎學MaixPy之單目攝像頭


配套 OV2640攝像頭:200W像素通用24P攝像頭
具有200萬像素(1632x1232像素),其體積小、工作電壓低,提供單片UXGA攝像和影像處理器的所有功能。通過SCCB總線控制,可以輸出整幀、子采樣、取窗口等方式的各種分辨率10位采樣數據。該產品UXGA圖像最高達到15幀/秒。用戶可以完全控制圖像質量、數據格式和傳輸方式。所有圖像處理功能過程包括伽瑪曲線、白平衡、飽和度、色度等都可以通過SCCB接口編程。OmmiVision圖像傳感器應用獨有的傳感器技術,通過減少或消除光學或電子缺陷如固定圖案噪聲、托尾、浮散等,提高圖像質量,得到清晰的穩定的彩色圖像。

 

OV2640主要參數
可以支持定制FPC長度,鏡頭角度(70-160度)可以支持定制FPC長度,鏡頭角度(70-160度)
感光陣列1632x1232 最大格式UXGA
IO電壓1.7V-3.3V 模擬電壓2.5-3.0v(內部LDO給核供電1.2V)
功耗工作TBD 休眠<20μA
溫度操作-30℃到70℃
穩定工作0℃到50℃
輸出格式(8位)YUV/YCbCr4:2:2 RGB565/555/444 GRB4:2:2 Raw RGB Data
光學尺寸1/4"
視場角70度
最大貞率15fps SXGA
靈敏度1.3V/(Lux-sec)
信噪比40 dB
動態范圍50 dB
瀏覽模式逐行
電子曝光1行到1247行
像素面積2.2μm x 2.2μm
暗電流15mV/s at 60℃
工作電流40mA

 

OV2640內部方塊圖

 

攝像頭電原理圖

 

#MicroPython動手做(06)——零基礎學MaixPy之單目攝像頭
#實驗程序之一:測試單目攝像頭

 

#MicroPython動手做(06)——零基礎學MaixPy之單目攝像頭
#實驗程序之一:測試單目攝像頭

import sensor    
import lcd

lcd.init()

sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.run(1)

while True:
    img = sensor.snapshot()
    lcd.display(img)

 

 

單目攝像頭sensor驅動

傳感器模塊,進行攝像頭配置及圖像抓取等,用於控制開發板攝像頭完成攝像任務。

1. 初始化單目攝像頭

重置並初始化單目攝像頭

sensor.reset([freq=24000000, set_regs=True, dual_buff=False])

參數

freq: 設置攝像頭時鍾頻率,頻率越高幀率越高,但是畫質可能更差。默認 24MHz, 如果攝像頭有彩色斑點(ov7740),可以適當調低比如 20MHz

set_regs: 允許程序寫攝像頭寄存器,默認為 True。 如果需要自定義復位序列,可以設置為False,然后使用sensor.__write_reg(addr, value) 函數自定義寫寄存器序列

dual_buff: 允許使用雙緩沖,會增高幀率,但是內存占用也會增加(大約為384KiB)

2. 捕獲圖像控制

啟動或關閉捕獲圖像功能(默認經過復位,設置幀大小,設置像素格式后會自動啟動攝像頭,不調用run(1)也會開始采集圖像)

sensor.run(enable)

參數

enable: 1 表示開啟 0 表示停止

返回值

return: 返回 1

3. 設置幀大小

用於設置攝像頭輸出幀大小,k210最大支持VGA格式,大於VGA將無法獲取圖像

MaixPy開發板配置的屏幕是320*240分辨率,推薦設置為QVGA格式

sensor.set_framesize(framesize[, set_regs=True])

參數

framesize: 幀大小

set_regs: 允許程序寫攝像頭寄存器,默認為 True。 如果需要自定義設置幀大小的序列,可以設置為False,然后使用sensor.__write_reg(addr, value) 函數自定義寫寄存器序列

返回值

True : 設置成功

False: 設置錯誤

 

#MicroPython動手做(06)——零基礎學MaixPy之單目攝像頭

#測試程序之二:嘗試拍一張照片

 

#MicroPython動手做(06)——零基礎學MaixPy之單目攝像頭
#測試程序之二:嘗試拍一張照片

import sensor, lcd, image

print("init")
lcd.init(freq=15000000)
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.run(1)
sensor.skip_frames(40)
print("init ok")

path = "/sd/image.jpg"
img = sensor.snapshot()
print("save image")
img.save(path)

print("read image")
img_read = image.Image(path)
lcd.display(img_read)
print("ok")





 

串口輸出
init
init i2c2
[MAIXPY]: find gc3028
True
True
init ok
save image
{"w":320, "h":240, "type"="rgb565", "size":153600}
read image
ok
MicroPython v0.5.0-31-gd3e71c0 on 2020-03-13; Sipeed_M1 with kendryte-k210

 

 

單目攝像頭sensor驅動
傳感器模塊,進行攝像頭配置及圖像抓取等,用於控制開發板攝像頭完成攝像任務。


4. 設置幀格式
用於設置攝像頭輸出格式
MaixPy開發板配置的屏幕使用的是RGB565,推薦設置為RGB565格式
sensor.set_pixformat(format[, set_regs=True])


參數
format: 幀格式
set_regs: 允許程序寫攝像頭寄存器,默認為 True。 如果需要自定義設置像素格式的序列,可以設置為False,然后使用sensor.__write_reg(addr, value) 函數自定義寫寄存器序列
可選的幀格式有GRAYSCALE, RGB565, YUV422


返回值
True : 設置成功
False: 設置錯誤


5. 圖像捕捉控制
圖像捕捉功能控制
sensor.run(enable)


參數
enable: 1 表示開始抓取圖像 0 表示停止抓取圖像


返回值
True : 設置成功
False: 設置錯誤


6. 拍攝圖像
使用攝像頭拍攝一張照片
sensor.snapshot()


參數



返回值
img: 返回的圖像對象

 

#MicroPython動手做(06)——零基礎學MaixPy之單目攝像頭
#測試程序之三:錄制一段視頻(30秒)

#MicroPython動手做(06)——零基礎學MaixPy之單目攝像頭
#測試程序之三:錄制一段視頻(30秒)

import video, sensor, image, lcd, time

lcd.init(freq=15000000)
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.run(1)
sensor.skip_frames(30)
v = video.open("/sd/capture.avi", record=1, interval=200000, quality=50)
i = 0
tim = time.ticks_ms()
while True:
    tim = time.ticks_ms()
    img = sensor.snapshot()
    lcd.display(img)
    img_len = v.record(img)
    # print("record",time.ticks_ms() - tim)
    i += 1
    if i > 100:
        break
print("finish")
v.record_finish()
lcd.clear()

  

 

串口輸出
>>> init i2c2
[MAIXPY]: find gc3028
True
True
finish
MicroPython v0.5.0-31-gd3e71c0 on 2020-03-13; Sipeed_M1 with kendryte-k210

 

Maixduino開發板上的micro-SD卡插槽,我插入的是4G

 

在電腦上打開micro-SD卡,里面有程序二拍的照片,及程序三錄制的一小段視頻(實際只有25秒)

 

 

錄制視頻的截圖

 

單目攝像頭sensor驅動
傳感器模塊,進行攝像頭配置及圖像抓取等,用於控制開發板攝像頭完成攝像任務。


7. 攝像頭控制
關閉攝像頭/切換攝像頭
sensor.shutdown(enable/select)


參數
單目攝像頭
enable: True 表示開啟攝像頭 False 表示關閉攝像頭


雙目攝像頭
select: 通過寫入 0 或 1 來切換攝像頭


返回值



8. 跳幀
跳過指定幀數或者跳過指定時間內的圖像,讓相機圖像在改變相機設置后穩定下來
sensor.skip_frames([n,time])


參數
n: 跳過 n 幀圖像
time: 跳過指定時間,單位為ms
若 n 和 time 皆未指定,該方法跳過300毫秒的幀;若二者皆指定,該方法會跳過 n 數量的幀,但將在 time 毫秒后返回


返回值



9. 分辨率寬度
獲取攝像頭分辨率寬度
sensor.width()


參數



返回值
int類型的攝像頭分辨率寬度


10. 分辨率高度
獲取攝像頭分辨率高度
sensor.height()


參數



返回值
int類型的攝像頭分辨率高度


11. 獲取幀緩沖
獲取當前幀緩沖區
sensor.get_fb()


參數



返回值
image類型的對象

 

#MicroPython動手做(06)——零基礎學MaixPy之單目攝像頭
#測試程序之四:獲取和顯示實時幀數

 

#MicroPython動手做(06)——零基礎學MaixPy之單目攝像頭
#測試程序之四:獲取和顯示實時幀數

import sensor
import image
import lcd
import time

clock = time.clock()
lcd.init()
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.run(1)
sensor.skip_frames(30)
while True:
    clock.tick()
    img = sensor.snapshot()
    fps =clock.fps()
    img.draw_string(2,2, ("%2.1ffps" %(fps)), color=(0,128,0), scale=2)
    lcd.display(img)

  

燈光下實時幀數大約15-17幀(fps)

 

 

單目攝像頭sensor驅動
傳感器模塊,進行攝像頭配置及圖像抓取等,用於控制開發板攝像頭完成攝像任務。


12. 獲取ID
獲取當前攝像頭ID
sensor.get_id()


參數



返回值
int類型的ID


13. 設置彩條測試模式
將攝像頭設置為彩條測試模式
開啟彩條測試模式后,攝像頭會輸出一彩條圖像,常用來檢測攝像機總線是否連接正確。
sensor.set_colorbar(enable)


參數
enable: 1 表示開啟彩條測試模式 0 表示關閉彩條測試模式


返回值



14. 設置對比度
設置攝像頭對比度
sensor.set_contrast(contrast)


參數
constrast: 攝像頭對比度,范圍為[-2,+2]


返回值
True : 設置成功
False: 設置錯誤


15. 設置亮度
設置攝像頭亮度
sensor.set_brightness(brightness)


參數
constrast: 攝像頭亮度,范圍為[-2,+2]


返回值
True : 設置成功
False: 設置錯誤


16. 設置飽和度
設置攝像頭飽和度
sensor.set_saturation(saturation)


參數
constrast: 攝像頭飽和度,范圍為[-2,+2]


返回值
True : 設置成功
False: 設置錯誤

 

視頻:k210開發板采集圖像,顯示實時幀數(20秒)
https://v.youku.com/v_show/id_XNDYxODk0MjMwNA==.html

 

 

燈光下的實驗場景

 

 

單目攝像頭sensor驅動
傳感器模塊,進行攝像頭配置及圖像抓取等,用於控制開發板攝像頭完成攝像任務。


17. 設置自動增益
設置攝像自動增益模式
sensor.set_auto_gain(enable,gain_db)




參數
enable: 1 表示開啟自動增益 0 表示關閉自動增益
gain_db: 關閉自動增益時,設置的攝像頭固定增益值,單位為dB
如果需要追蹤顏色,需要關閉自動增益


返回值



18. 獲取增益值
獲取攝像頭增益值
sensor.get_gain_db()


參數



返回值
float類型的增益值


19. 設置水平鏡像
設置攝像頭水平鏡像
sensor.set_hmirror(enable)


參數
enable: 1 表示開啟水平鏡像 0 表示關閉水平鏡像


返回值



20. 寫入寄存器
往攝像頭寄存器寫入指定值
sensor.__write_reg(address, value)


參數
address: 寄存器地址
value : 寫入值


返回值



21. 讀取寄存器
讀取攝像頭寄存器值
sensor.__read_reg(address)


參數
address: 寄存器地址


返回值
int類型的寄存器值


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM