[OpenCV-Python] OpenCV 中的 Gui (五) 視頻

來源:互聯網
上載者:User

標籤:方法   旋轉   pre   else   資訊   ini   查看   依賴   否則   

5 視頻


目標
? 學會讀取視頻檔案,顯示視頻,儲存視頻檔案
? 學會從網路攝影機擷取並顯示視頻
? 你將會學習到這些函數:cv2.VideoCapture(),cv2.VideoWrite()


5.1 用網路攝影機捕獲視頻
我們經常需要使用網路攝影機捕獲即時映像。OpenCV 為這中應用提供了一個
非常簡單的介面。讓我們使用網路攝影機來捕獲一段視頻,並把它轉換成灰階視頻
顯示出來。從這個簡單的任務開始吧。
為了擷取視頻,你應該建立一個 VideoCapture 對象。他的參數可以是
裝置的索引號,或者是一個視頻檔案。裝置索引號就是在指定要使用的網路攝影機。
一般的膝上型電腦都有內建網路攝影機。所以參數就是 0。你可以通過設定成 1 或
者其他的來選擇別的網路攝影機。之後,你就可以一幀一幀的捕獲視頻了。但是最
後,別忘了停止捕獲視頻。

import numpy as npimport cv2cap = cv2.VideoCapture(0)while(True):    # Capture frame-by-frame    ret, frame = cap.read()    # Our operations on the frame come here    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)    # Display the resulting frame    cv2.imshow(‘frame‘,gray)    if cv2.waitKey(1) & 0xFF == ord(‘q‘):        break# When everything done, release the capturecap.release()cv2.destroyAllWindows()

cap.read() 返回一個布爾值(True/False)。如果幀讀取的是正確的,
就是 True。所以最後你可以通過檢查他的傳回值來查看視頻檔案是否已經到
了結尾。
有時 cap 可能不能成功的初始化網路攝影機裝置。這種情況下上面的代碼會報
錯。你可以使用 cap.isOpened(),來檢查是否成功初始化了。如果傳回值是
True,那就沒有問題。否則就要使用函數 cap.open()。
你可以使用函數 cap.get(propId) 來獲得視頻的一些參數資訊。這裡
propId 可以是 0 到 18 之間的任何整數。每一個數代表視頻的一個屬性,見
下表
其中的一些值可以使用 cap.set(propId,value) 來修改,value 就是
你想要設定成的新值。
例如,我可以使用 cap.get(3) 和 cap.get(4) 來查看每一幀的寬和高。
預設情況下得到的值是 640X480。但是我可以使用 ret=cap.set(3,320)
和 ret=cap.set(4,240) 來把寬和高改成 320X240。
注意:當你的程式報錯時,你首先應該檢查的是你的網路攝影機是否能夠在其他程
序中正常工作(比如 linux 下的 Cheese)。


5.2 從檔案中播放視頻
與從網路攝影機中捕獲一樣,你只需要把裝置索引號改成視頻檔案的名字。在
播放每一幀時,使用 cv2.waiKey() 設定適當的期間。如果設定的太低視
頻就會播放的非常快,如果設定的太高就會播放的很慢(你可以使用這種方法
控制視頻的播放速度)。通常情況下 25 毫秒就可以了。

import numpy as npimport cv2cap = cv2.VideoCapture(‘vtest.avi‘)while(cap.isOpened()):    ret, frame = cap.read()    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)    cv2.imshow(‘frame‘,gray)    if cv2.waitKey(1) & 0xFF == ord(‘q‘):        breakcap.release()cv2.destroyAllWindows()

 

注意:你應該確保你已經裝了合適版本的 ffmpeg 或者 gstreamer。如果你裝
錯了那就比較頭疼了。


5.3 儲存視頻
在我們捕獲視頻,並對每一幀都進行加工之後我們想要儲存這個視頻。對
於圖片來時很簡單只需要使用 cv2.imwrite()。但對於視頻來說就要多做點工
作。
這次我們要建立一個 VideoWriter 的對象。我們應該確定一個輸出檔案
的名字。接下來指定 FourCC 編碼(下面會介紹)。播放頻率和幀的大小也都
需要確定。最後一個是 isColor 標籤。如果是 True,每一幀就是彩色圖,否
則就是灰階圖。
FourCC 就是一個 4 位元組碼,用來確定視頻的編碼格式。可用的編碼列表
可以從fourcc.org查到。這是平台依賴的。下面這些編碼器對我來說是有用個。
? In Fedora: DIVX, XVID, MJPG, X264, WMV1, WMV2. (XVID is
more preferable. MJPG results in high size video. X264 gives
very small size video)
? In Windows: DIVX (More to be tested and added)
? In OSX : (I don’t have access to OSX. Can some one fill this?)
FourCC 碼以下面的格式傳給程式,以 MJPG 為例:
cv2.cv.FOURCC(‘M‘,‘J‘,‘P‘,‘G‘) 或者 cv2.cv.FOURCC(*‘MJPG‘)。


下面的代碼是從網路攝影機中捕獲視頻,沿水平方向旋轉每一幀並儲存它。

import numpy as npimport cv2cap = cv2.VideoCapture(0)# Define the codec and create VideoWriter objectfourcc = cv2.VideoWriter_fourcc(*‘XVID‘)out = cv2.VideoWriter(‘output.avi‘,fourcc, 20.0, (640,480))while(cap.isOpened()):    ret, frame = cap.read()    if ret==True:        frame = cv2.flip(frame,0)        # write the flipped frame        out.write(frame)        cv2.imshow(‘frame‘,frame)        if cv2.waitKey(1) & 0xFF == ord(‘q‘):            break    else:        break# Release everything if job is finishedcap.release()out.release()cv2.destroyAllWindows()

 


更多資源
練習

[OpenCV-Python] OpenCV 中的 Gui (五) 視頻

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.