永興的筆記-OpenCV-14視頻基本操作 1

在這裏插入圖片描述

一、什麼是視頻?

1、視頻的基本概念:
視頻(Video)泛指將一系列靜態影像以電信號的方式加以捕捉、紀錄、處理、儲存、傳送與重現的各種技術。連續的圖像變化每秒超過24幀(frame)畫面以上時,根據視覺暫留原理,人眼無法辨別單幅的靜態畫面;看上去是平滑連續的視覺效果,這樣連續的畫面叫做視頻。
簡單來說視頻就是很多張照片連續切換。
2、視頻的基本屬性:

  • 畫面更新率(FPS):
    Frame rate中文常譯爲“畫面更新率”或“幀率”,是指視頻格式每秒鐘播放的靜態畫面數量。
  • 分辨率
    • 各種電視規格分辨率比較視頻的畫面大小稱爲“分辨率”。數位視頻以像素爲度量單位,而類比視頻以水平掃描線數量爲度量單位。
    • 新的高清電視(HDTV)分辨率可達1920×1080p60,即每條水平掃描線有1920個像素,每個畫面有1080條掃描線,以每秒鐘60張畫面的速度播放。
    • 3D視頻的分辨率以voxel(volume picture element,中文譯爲“體素”)來表示。例如一個512×512×512體素的分辨率用於簡單的3D視頻,可以被包括部分PDA在內的電腦設備播放。
  • 長寬比(Aspectratio):
    是用來描述視頻畫面與畫面元素的比例。
    • 傳統的電視屏幕長寬比爲4:3(1.33:1)。
      HDTV的長寬比爲16:9(1.78:1)。而35mm膠捲底片的長寬比約爲1.37:1。
    • 雖然電腦熒幕上的像素大多爲正方形,但是數字視頻的像素通常並非如此。例如使用於PAL及NTSC訊號的數位保存格式CCIR 601,以及其相對應的非等方寬螢幕格式。因此以720x480像素記錄的NTSC規格DV影像可能因爲是比較“瘦”的像素格式而在放映時成爲長寬比4:3的畫面,或反之由於像素格式較“胖”而變成16:9的畫面。
  • 壓縮技術:
    視頻壓縮技術(僅適用數位訊號)
    自從數位信號系統被廣泛使用以來,人們發展出許多方法來壓縮視頻串流。由於視頻資料包含了空間的與時間的冗餘性,所以使得未壓縮的視頻串流以傳送效率的觀點來說是相當糟糕的。
    總體而言,空間冗餘性可以藉由“只記錄單幀畫面的一部分與另一部分的差異性”來減低;這種技巧被稱爲幀內壓縮(intraframe compression)。並且與圖像壓縮密切相關,而時間冗餘性則可藉由“只記錄兩幀不同畫面間的差異性”來減低;這種技巧被稱爲幀間壓縮(interframe compression),包括運動補償以及其他技術。目前最常用的視頻壓縮技術爲DVD與衛星直播電視所採用的MPEG-2,以及因特網傳輸常用的MPEG-4。
  • 視頻編碼 :
    所謂視頻編碼方式就是指通過壓縮技術,將原始視頻格式的文件轉換成另一種視頻格式文件的方式。視頻流傳輸中最爲重要的編解碼標準有國際電聯的H.261、H.263、H.264,運動靜止圖像專家組的M-JPEG和國際標準化組織運動圖像專家組的MPEG系列標準,此外在互聯網上被廣泛應用的還有Real-Networks的RealVideo、微軟公司的WMV以及Apple公司的QuickTime等。
  • 視頻格式:
    視頻格式實質是視頻編碼方式,可以分爲適合本地播放的本地影像視頻和適合在網絡中播放的網絡流媒體影像視頻兩大類。儘管後者在播放的穩定性和播放畫面質量上可能沒有前者優秀,但網絡流媒體影像視頻的廣泛傳播性使之正被廣泛應用於視頻點播、網絡演示、遠程教育、網絡視頻廣告等互聯網信息服務領域。
    視頻格式主要有rm,rmv,mpeg1-4 mov mtv dat wmv avi 3gp amv dmv flv mp4,這類格式可是影像陣營中的一個大家族,也是我們平時所見到的最普遍的一種視頻格式。

二、OpenCV的視頻操作:
1、對於視頻的讀取,OpenCV提供了接口VideoCapture。要想編程實現視頻的讀取與顯示,需要熟悉一下該類的構造函數和成員函數。
Video = cv2.VideoCapture(index)

index 作用
0 表示攝像頭編號,0一般是本機攝像頭
"路徑+文件名“ 打開視頻文件
“網絡地址“ 打開網絡攝像頭

Video.isOpened()
判斷對象是否創建成功

  • 返回布爾值(true or false)

isOpened , Image = Video.read()
讀取一幀視頻
返回:

  • isOpened 是否讀取成功
  • Image 圖像

Video.get(param)
在這裏插入圖片描述

import cv2
Video = cv2.VideoCapture(0) #初始化本機攝像頭
while(Video.isOpened()): #成功則開始讀取
    isO , VImg = Video.read() #讀取視頻幀
    if isO : #成功則顯示
        cv2.imshow("Video",VImg)
    if cv2.waitKey(10) == ord("q"): #每幀延時10ms並判斷是否按下q鍵
        break
Video.release() #關閉攝像頭
cv2.destroyAllWindows()

2、視頻的保存:
OpenCV提供了接口VideoWriter,要想編程實現保存視頻,需要熟悉一下該類的構造函數和成員函數。

writer = cv2.VideoWriter( filename, fourcc, fps, frameSize,size ,isColor)

  • filename : 保存的文件名
  • fourcc: 編解碼器4字代碼
    cv2.VideoWriter_fourcc
    設置視頻格式:
fourcc 描述
cv2.VideoWriter_fourcc(‘I’,‘4’,‘2’,‘0’) 4:2:0色度子採樣。兼容性好,但文件較大。文件擴展名.avi。
cv2.VideoWriter_fourcc(‘P’,‘I’,‘M’,‘1’) MPEG-1編碼類型,文件擴展名.avi。隨機訪問,靈活的幀率、可變的圖像尺寸、定義了I-幀、P-幀和B-幀 、運動補償可跨越多個幀 、半像素精度的運動向量 、量化矩陣、GOF結構 、slice結構 、技術細節、輸入視頻格式。
cv2.VideoWriter_fourcc(‘X’,‘V’,‘I’,‘D’) –MPEG-4編碼類型,視頻大小爲平均值,MPEG4所需要的空間是MPEG1或M-JPEG的1/10,它對運動物體可以保證有良好的清晰度,間/時間/畫質具有可調性。文件擴展名.avi。
cv2.VideoWriter_fourcc(‘T’,‘H’,‘E’,‘O’) —OGGVorbis,音頻壓縮格式,有損壓縮,類似於MP3等的音樂格式。,兼容性差,件擴展名.ogv。
cv2.VideoWriter_fourcc(‘F’,‘L’,‘V’,‘1’) FLV是FLASH VIDEO的簡稱,FLV流媒體格式是一種新的視頻格式。由於它形成的文件極小、加載速度極快,使得網絡觀看視頻文件成爲可能,它的出現有效地解決了視頻文件導入Flash後,使導出的SWF文件體積龐大,不能在網絡上很好的使用等缺點。文件擴展名爲.flv。
  • frameSize: 視頻幀大小
  • size:視頻的寬和高
  • isColor: 布爾值 (true or false ) 視頻是否爲彩色

writer.writer(image)
保存圖片到視頻文件對象

import cv2
Video = cv2.VideoCapture(0) #初始化本機攝像頭
fps = Video.get(5)  #獲取原視頻幀率
size = (int(Video.get(3)),int(Video.get(4)))
writer=cv2.VideoWriter("output.avi",cv2.VideoWriter_fourcc(*'XVID'),fps,size)#'MJPG'對windows沒有用
while(Video.isOpened()): #成功則開始讀取
    isO , VImg = Video.read() #讀取視頻幀
    if isO : #成功則顯示
        cv2.imshow("Video",VImg)
        writer.write(VImg)  #逐幀保存
    if cv2.waitKey(1) == ord("q" ):
        break
Video.release() #關閉攝像頭
cv2.destroyAllWindows()

練習題10:

利用攝像頭或者喜歡的視頻,進行輪廓繪製,並繪製在原視頻上進行不間斷播放。
評論出你的答案

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章