天天看點

Raspberry Camera詳解+picamera庫+Opencv控制

使用樹莓派的攝像頭,将樹莓派自身提供的picamera的API資料轉換為Python Oencv可用圖像資料:

# import the necessary packages
from picamera.array import PiRGBArray
from picamera import PiCamera
import time
import cv2
# initialize the camera and grab a reference to the raw camera capture
camera = PiCamera()
camera.resolution = (640, 480)
camera.framerate = 32
camera.hflip = True
camera.vflip = True
rawCapture = PiRGBArray(camera, size=(640, 480))
# allow the camera to warmup
time.sleep(0.1)
# capture frames from the camera
for frame in camera.capture_continuous(rawCapture, format="bgr", use_video_port=True):
    # grab the raw NumPy array representing the image, then initialize the timestamp
    # and occupied/unoccupied text
    image = frame.array
    # show the frame
    cv2.imshow("Frame", image)
    key = cv2.waitKey(1) & 0xFF
    # clear the stream in preparation for the next frame
    rawCapture.truncate(0)
    # if the `q` key was pressed, break from the loop
    if key == ord("q"):
        break      

這裡簡單的講一下picamera對象的相關内容:

1、首先使用picamera子產品當中的PiCamera方法建立傳回一個camera的對象:

camera = PiCamera()      

2、初始化camera對象當中的相關參數(可設定也可以讀取):

camera.saturation = 80 # 設定圖像視訊的飽和度
camera.brightness = 50 # 設定圖像的亮度(50表示白平衡的狀态)
camera.shutter_speed = 6000000 # 相機快門速度
camera.iso = 800 # ISO标準實際上就是來自膠片工業的标準稱謂,ISO是衡量膠片對光線敏感程度的标準。如50 ISO, 64 ISO, 100 ISO表示在曝光感應速度上要比高數值的來得慢,高數值ISO是指超過200以上的标準,如200 ISO, 400 ISO
camera.sharpness = 0 #設定圖像的銳度值,預設是0,取值範圍是-100~100之間
camera.framrate = 32 #這裡可能用的Fraction是一個分數子產品來存儲分數1/6,保證分數運算的精度(記得調用子產品:from fractions import Fraction) 
camera.hflip = Ture # 是否進行水準翻轉 
camera.vflip = False #是否進行垂直翻轉 
camera.rotation = 0 #是否對圖像進行旋轉 
camera.resolution = (280,160) #設定圖像的width和height 
a_gain = camera.analog_gain #這個值表示攝像頭傳感器件到數字裝換之前的模拟信号的增益,格式是Fraction的格式 一般似乎也用不上
d_gain = camera.digital_gain #這個值表示攝像頭的數字增益大小 一般似乎也用不上
camera.led = False #值為False那麼led為關燈的狀态,True為開燈的狀态      

注:camera.led這個參數在Raspberry 3代上已經不能使用了!原因是說已經将攝像頭led的控制GPIO重定向到了外部擴充接口上......是以你修改/boot/config.txt檔案的内容也是沒用的,當然對于pi3這一代樹莓派修改這個檔案也是無濟于事。無奈啊~

ISO參數介紹:

   感光度,英文名稱為 International Organization for Standardization (ISO),說到相機中的ISO參數不得不提一下膠片速度(Film Speed)。膠片速度是感光膠片對光敏感度的度量。相對而言靈敏度差的膠片,對應一個低速的索引值,這樣就會需要對光進行更長的曝光來達到高靈敏膠片的效果,是以稱之為低速膠片,高靈敏的膠片稱之為高速膠片,設定的範圍ISO100到ISO28000。

ISO調節的實驗結果(測試條件:Frame_Rate=32 快門速度shutter_speed=6000000 飽和度saturation = 100 圖像亮度brightness = 50)

Raspberry Camera詳解+picamera庫+Opencv控制

Shutter參數介紹:

    快門,英文名稱為Shutter,快門是相機上控制感光片有效曝光時間的一種裝置。快門的工作原理是這樣的,為了保護相機内的感光器件,不至于曝光,快門總是關閉的;拍攝時,調整好快門速度後,隻要按住照相機的快門釋放鈕(也就是拍照的按鈕),在快門開啟與閉合的間隙間,讓通過攝影鏡頭的光線,使照相機内的感光片獲得正确的曝光,光穿過快門進入感光器件,寫入記憶卡。快門速度一般的表示方法是1/100s、1/30s、2s。

Shutter調節的實驗結果(測試條件:Frame_Rate=32 ISO感光度=800 飽和度saturation = 100圖像亮度brightness = 50)

Raspberry Camera詳解+picamera庫+Opencv控制

Saturation參數介紹:

    所謂的飽和度,指的其實是色彩的純度,純度越高,表現越鮮明,純度較低,表現則較黯淡,色飽和度表示光線的彩色深淺度或鮮豔度,取決于彩色中的白色光含量,白光含量越高,即彩色光含量就越低,色彩飽和度即越低,反之亦然。saturation的取值範圍是 0-100之間。

Saturation調節的實驗結果(測試條件:Frame_Rate=32 快門速度shutter_speed=6000000 ISO感光度=800 圖像亮度brightness = 50) 

Raspberry Camera詳解+picamera庫+Opencv控制

Brightness亮度參數介紹:

   色彩亮度(“Color Brightness”)的新标準将用來測量色彩的光輸出情況,評價錄影機的色彩表現,使用者可根據此标準的規格來更好地了解産品性能。 設定的範圍是0-100之間,50表示的是白平衡狀态。

Brightness調節的實驗結果(測試條件:Frame_Rate=32 快門速度shutter_speed=6000000 ISO感光度=800 飽和度saturation = 100)

Raspberry Camera詳解+picamera庫+Opencv控制

Sharpness銳度參數介紹:

    Sharpness決定了圖像對細節的表達程度,圖像的銳度越高表示圖像對物體的邊緣和細節的描述越好,從下面的測試結果卻是能夠看到細節的相關變化卻是比較明顯。

Sharpness調節的實驗結果(測試條件:Frame_Rate=32 ISO感光度=800 飽和度saturation = 0 圖像亮度brightness = 50)

Raspberry Camera詳解+picamera庫+Opencv控制

光圈參數介紹:(樹莓派相機的參數中似乎光圈的大小是固定的,不可以調節,這裡列出來記錄,友善後面的使用和了解)

   光圈英文名稱為Aperture,光圈是一個用來控制光線透過鏡頭,進入機身内感光面的光量的裝置,它通常是在鏡頭内,光在通過鏡頭某個位置的多片金屬葉片(收攏之後)則能在鏡頭上就控制光線進入的量。我們平時所說的光圈值 F2.8、F8、F16等是光圈“系數”,是相對光圈,并非光圈的實體孔徑,與光圈的實體孔徑及鏡頭到感光器件(膠片或CCD或CMOS)的距離有關。

簡單相機的結構圖:

Raspberry Camera詳解+picamera庫+Opencv控制

相關參數的設定技巧:

1、ISO感光度的設定技巧

  • 一般白天光線充足的情況ISO是100到200。
  • 在黑暗的條件下(如下雨天),ISO調到300-400,比較暗調到800,燈光非常暗(太陽下山後),調到1000以上,拍夜景(如夜間慶典、演唱會)調到1600以上。
  • ISO調到越高,拍出來的照片噪點就越多,是以ISO不是越高越好,隻是在光線不足的情況下使用,并且盡可能調低ISO數值。

2、快門速度的設定技巧

  • 一般情況下,正常快門速度是在60分之一秒到80分之一秒。
  • 拍攝行人、陰天或者日落時候的運動對象快門速度1/125秒。
  • 拍攝高速運動的物體或畫面,快門速度360/1秒~600/1秒,如拍打籃球的畫面。
  • 拍攝下落的水滴需要1/1000秒。
  • 拍綢緞感的流水,或者夜景汽車燈河用慢速快門。
  • 拍運動定格用快速快門。
  • 室外光線條件好,則快門可以較快,光線暗則要放慢快門速度。
  • 快門數一般是沒用常用的,你要是想設定為預設快門,那麼就是用A檔或是自動擋吧!隻有這兩個檔位是預設快門數。像S檔和M檔都是可以設定快門速度的。

3、使用camera對象當中的相關函數API:

圖像拍照+實時視訊

camera.capture('test.jpg', use_video_port = False) # 拍攝一張圖檔,圖檔的名稱為test.jpg use_video_port用來指定是通過視訊接口來使用還是普通的接口,詳解如下
camera.capture_continuous(rawCapture, format="bgr", use_video_port=True) # 連續的拍攝一組視訊幀,将每一幀都存儲在rawCapture這個變量當中,存儲的格式是bgr的格式,使用了攝像頭的接口      

capture

(output, format=None, use_video_port=False, resize=None, splitter_port=0, bayer=False, **options)  從攝像頭中獲得一張圖像,将這張圖像存儲在output當中.

capture_continuous

(output, format=None, use_video_port=False, resize=None, splitter_port=0, burst=False, bayer=False, **options) 從攝像頭上擷取連續的視訊流,相關的參數和上面的函數相似

  參數output是一個用來儲存圖像資料的區域:

  • output為字元串string的時候,表示将得到的資料寫入到檔案名是string檔案當中
  • output是一個可以寫入的對象時,就相當于将圖像的資料追加append到對象的後面
  • output也可以是一個具有buffer protocal資料類型的資料(要保證足夠大的寫入空間來儲存圖像)

  參數format是表示檔案的類型,主要有下面的檔案類型:

  • 'jpeg'

     - Write a JPEG file
  • 'png'

     - Write a PNG file
  • 'gif'

     - Write a GIF file
  • 'bmp'

     - Write a Windows bitmap file
  • 'yuv'

     - Write the raw image data to a file in YUV420 format
  • 'rgb'

     - Write the raw image data to a file in 24-bit RGB format
  • 'bgr'

     - Write the raw image data to a file in 24-bit BGR format

  參數use_video_port用來表示擷取圖像的端口:

  • True 表示從視訊端口擷取圖像,這個時候為了保證視訊的幀速,畫質就會降低
  • False 表示從标準的端口擷取圖像,圖像的品質較高,擷取的時間較長

下面是Camera拍照的結果對比(注意,這裡的相機參數我都沒有設定全是預設的參數):

Raspberry Camera詳解+picamera庫+Opencv控制

conclusion:  這裡我們明顯能夠看到,當use_video_port的參數為True和False的圖像參數品質的不同之處,是以說在拍照的時候就要記得采用False參數!

視訊錄像

camera.start_recording('Video.mjpeg',format = 'mjpeg') # 開始進行錄制視訊的參數設定,param1是錄制視訊的檔案名  param2是設定錄制檔案的格式 param3是錄制視訊的尺寸大小,詳細如下解釋
camera.wait_recording(20) # 啟動開始錄制,等待總共錄制的時間為20s 主要機關是s秒
camera.stop_recording() # 停止視訊的錄制功能      

實驗錄制結果如下:

Raspberry Camera詳解+picamera庫+Opencv控制
Raspberry Camera詳解+picamera庫+Opencv控制
Raspberry Camera詳解+picamera庫+Opencv控制

不過看起來效果似乎變暗了,不知道是不是燈光的問題。。。

上面的測試檔案為Test_Camera.py 具體的代碼我上傳到了我部落格的檔案空間中,大家可以下載下傳使用(總共有三個Section,每調用一個Section的時候去掉注釋即可)。

備注:使用攝像頭的過程中如果遇到如下的錯誤說明已經有程序調用了Raspberry的攝像頭了,硬體已經被占用,是以不能啟動攝像頭。

Raspberry Camera詳解+picamera庫+Opencv控制

這個時候你隻需要關閉對應調用攝像頭的程序,釋放攝像頭的資源就可以繼續使用了。

2020-12-18這裡增加一些相機相關參數的配置,為日後更好的使用好Camera做準備:

Raspberry Camera詳解+picamera庫+Opencv控制

1. 自動曝光參數-AE(AutomaticExposure):由相機内置測光表進行曝光控制,拍出與眼睛看到一緻的畫面.

2. 白平衡-AWB:相機内部根據外界場景對拍攝的事物進行顔色的矯正,例如在鎢燈黃光拍攝下的白紙,在白平衡不足情況下會在照片中呈現黃色,白平衡可以矯正這種情況.

3. 相機死點-Blemish:相機成像CCD由于工藝等原因導緻出現某一些成像像素點出現常量或者常滅的情況.參看這裡

4. 暗角|鏡頭陰影-Shading:Lens Shading可細分為Luma Shading(亮度均勻性)和Color Shading(色彩均勻性)兩種。其中,Luma Shading就是我們常說的暗角。既圖像呈現出中心區域較亮,四周偏暗的現象,其形成原因:(a)透鏡在中心位置和邊緣位置的光衰減情況不同. (b)相機安裝精度,Color Shading導緻的原因:(a)微透鏡的主光線角CRA(Chief ray angle)值與鏡頭的CRA值不比對. (b)IR-cut filter幹涉型紅外截止濾波片在可見光區域有較高的透過率,存在較低反射率,而在紅外區域正好相反,當成角度拍攝照片時,紅外光在IR膜上會有較大反射,經過多次反射後,被Sensor接收進而改變圖像R通道的值,引起圖像偏色. 參考這裡

5. 信噪比-SNR:标準像素信号與暗電流信号之間的比例.

6. 反差對比鏡頭解像力-MTF(Modulation Transfer Function):一種測試鏡頭反差對比度及銳利度的評估方法,通過使用反差對比的概念來檢定鏡頭解像力,所謂的反差對比就是1mm的寬度中,正弦濃度變化反複有幾次的意思(請想象空間頻率如同海浪一樣的波型變化),原本充足的反差可以很容易辨識出兩條線來,而當空間頻率加大時,也就是線條越緊密時,反差也逐漸縮小,終于反差衰減到全部變成灰色,再也分辨不出黑白條紋來,就表示鏡頭的解像力已到極限,對于一般鏡頭而言,MTF圖像橫軸為鏡頭邊緣到中心的距離,縱軸為模糊程度評分,随着距離增加其評分則會相應下降,對于較好的鏡頭,其MTF圖呈現為一條直線. 參考這裡

7. 未完待續

                                                                                                        完~

轉載請注明出處!感謝GISPALAB實驗室的老師和同學們的幫助和支援~