OpenCV教程2(python)


OpenCV教程2(python)

上節我們簡單的介紹了一下OpenCV操作圖片,這節我們講一下視頻的有關操作。視頻和圖片從某種程度上來講其實是同一種東西,基本上所有的視頻都是由一幀一幀圖片組成的,操作視頻其實就是對每一幀的圖片進行操作。

OpenCV基礎操作-視頻

1.獲取視頻和播放視頻

還是先上代碼,再去解釋代碼,這樣便於學習。

import numpy as np
import cv2

#讀取攝像頭,若想讀取視頻,參數0換成視頻的路徑+文件名
cap = cv2.VideoCapture(0) 

while(True):
    ret, frame = cap.read()
    cv2.imshow('frame',frame)
    if cv2.waitKey(1)== ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

對照前面操作圖像的代碼,是不是發現很像。

cv2.VideoCapture() 創建了一個VideoCapture對象,用來捕獲視頻。它的參數可以是設備的索引號,或是一個視頻文件。設備的索引號是指定要用的攝像頭,一般內置的攝像頭的索引號為0,可以換成1或其他的數字調用其他的攝像頭。

因為視頻是一幀一幀獲取的,所以接下來是個一個while True 循環,循環讀取每一幀。

ret, frame = cap.read()讀取每一幀,其中ret表示一個True/False的布爾值,用來表示是否讀取成功。frame表示讀取到的np.array類型的每一幀,就是圖片。

cv2.imshow('frame',frame)將每一幀顯示在一個叫frame的窗口上。這里解釋一下,為什么這樣顯示在窗口上會產生視頻的效果。前面操作圖片的時候,我們提到過,顯示多幅圖像的時候,若cv2.imshow() 指定相同的窗口名,這樣后面顯示的圖片會覆蓋前面的圖片,而產生一個窗口。這里視頻顯示也是同樣的道理,每次while循環,窗口'frame'的名字不變,這樣每一幀會覆蓋上一幀,就產生了視頻的效果。

if cv2.waitKey(1)== ord('q'):break 這里程序會等一毫秒,只要用戶沒有按下'q'鍵,程序就會執行下一個循環,若按下了'q'鍵,則程序會break跳出while循環。這里可以通過改變cv2.waitKey()里面的時間參數,來改變視頻的播放速度。

cap.release()cv2.destroyAllWindows()是用來停止捕獲視頻和關閉相應的顯示窗口的。

補充:
有時cv2.VideoCapture()可能不能成功的初始化攝像頭設備。這種情況下代碼會報
錯。你可以使用 cap.isOpened(),來檢查是否成功初始化了。如果返回值是
True,那就沒有問題。否則就要使用函數 cap.open()。這是while True可以改為
while cap.isOpened()
函數 cap.get(propId) 可以用來獲得視頻的一些參數信息。這里
propId 可以是 0 到 18 之間的任何整數。每一個數代表視頻的一個屬性:
• CV_CAP_PROP_POS_MSEC Current position of the video file in milliseconds.
• CV_CAP_PROP_POS_FRAMES 0-based index of the frame to be decoded/captured next.
• CV_CAP_PROP_POS_AVI_RATIO Relative position of the video file: 0 - start of the film, 1 - end of the film.
• CV_CAP_PROP_FRAME_WIDTH Width of the frames in the video stream.
• CV_CAP_PROP_FRAME_HEIGHT Height of the frames in the video stream.
• CV_CAP_PROP_FPS Frame rate.
• CV_CAP_PROP_FOURCC 4-character code of codec.
• CV_CAP_PROP_FRAME_COUNT Number of frames in the video file.
• CV_CAP_PROP_FORMAT Format of the Mat objects returned by retrieve() .
• CV_CAP_PROP_MODE Backend-specific value indicating the current capture mode.
• CV_CAP_PROP_BRIGHTNESS Brightness of the image (only for cameras).
• CV_CAP_PROP_CONTRAST Contrast of the image (only for cameras).
• CV_CAP_PROP_SATURATION Saturation of the image (only for cameras).
• CV_CAP_PROP_HUE Hue of the image (only for cameras).
• CV_CAP_PROP_GAIN Gain of the image (only for cameras).
• CV_CAP_PROP_EXPOSURE Exposure (only for cameras).
• CV_CAP_PROP_CONVERT_RGB Boolean flags indicating whether images should be converted to RGB.
• CV_CAP_PROP_WHITE_BALANCE Currently unsupported
• CV_CAP_PROP_RECTIFICATION Rectification flag for stereo cameras (note: only supported by DC1394 v 2.x backend currently)
對應的,使用 cap.set(propId,value) 來修改視頻屬性,value 就是你想要設置成的新值。

2.保存視頻

OpenCV保存視頻稍稍有點麻煩,因為保存視頻的時候涉及到一個格式的問題,普通的視頻格式對應的編碼器不一樣,這里還需提供編碼器。不多說了,直接上代碼,從代碼中學習。

import numpy as np
import cv2
import sys
cap = cv2.VideoCapture(r'testvideo.rmvb')

#適用於OpenCV3,OpenCV2用cv2.cv.FOURCC(*'MJPG')
#寫成這樣也行cv2.cv.FOURCC('M','J','P','G')
fourcc = cv2.VideoWriter_fourcc(*'MJPG')   
out = cv2.VideoWriter('output.avi',fourcc,20.0,(int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)),int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))))

while cap.isOpened():
    ret,frame = cap.read()
    if ret:
        out.write(frame)
        cv2.imshow('frame',frame)
        if cv2.waitKey(1) == ord('q'):
            break
     else:
         break

cap.release()
out.release()
cv2.destroyAllWindows()

cv2.VideoWriter_fourcc(FourCC) 參數FourCC 就是一個 4 字節碼,用來確定視頻的編碼格式。可用的編碼列表可以從fourcc.org查到。這種編碼格式是依賴於系統平台的,查到的許多編碼不一定能用。

cv2.VideoWriter()創建一個 VideoWriter 的對象。參數一:一個輸出文件的名字;參數二:FourCC 編碼;參數三:播放頻率;參數四:幀的大小(視頻的長和寬);參數五:是否為彩色,True為彩色,False為灰度。

接下來while循環里就是讀取每一幀,再向目標寫入每一幀了,跟前面大致相同,這里就不多說了。

最后三行是關閉讀取操作,寫入操作和相應的顯示窗口。

3.總結

視頻操作的基本操作大體就這么多了,讀者只要明白視頻操作跟圖像操作本質上沒有區別。
還有一點不是很重要,但是不知道的話,有時遇到問題的話,會很頭疼。在OpenCV中讀取到彩色圖片是BGR形式的,而不是通常所用的RGB形式的,有時用其他的圖像處理庫去顯示OpenCV讀取的圖像,需要將BGR轉為RGB, 顏色空間轉換后面會詳細講的。
這里有人會問了,為什么讀取的圖片是BGR形式的,顯示出來還是正常的RGB顯示的呢?
其實,讀者要弄明白一件事,在計算機中存儲的圖像,包括所有的圖像處理時讀取的圖像,都是以數組或者說是矩陣的形式存在的。存儲和讀取的時候,計算機和人們並不關心這個數組或者矩陣是什么樣子的,計算機和人只關心怎么去顯示圖像。比如,圖片雖然存儲成RGB形式的三通道矩陣,但計算機程序顯示的時候,程序可以顯示成RGB,BGR,GBR,BRG….,顯示這一步完全是程序控制的。讀者好好體會一下,其中的意思。

下一節,我們講一下圖像的一些核心操作,主要是對圖像的像素操作。


免責聲明!

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



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