OpenCV+Python 攝像頭採集代碼

代碼

# -*- coding:utf-8-*-

import numpy as np
import cv2

#0號攝像頭,也可以1、2,lsusb查看
cap = cv2.VideoCapture(0)

#設置分辨率
cap.set(3,1280)
cap.set(4,1024)
time.sleep(2) #必須要此步驟,否則失敗
cap.set(15, -8.0)

#只能是如下選擇分辨率.
#160.0 x 120.0
#176.0 x 144.0
#320.0 x 240.0
#352.0 x 288.0
#640.0 x 480.0
#1024.0 x 768.0
#1280.0 x 1024.0

fps = cap.get(cv2.cv.CV_CAP_PROP_FPS)
size = (int(cap.get(cv2.cv.CV_CAP_PROP_FRAME_WIDTH)),
        int(cap.get(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT)))
fourcc = cv2.cv.FOURCC(*'CVID')
out = cv2.VideoWriter(filePath, fourcc, fps, size)

while (cap.isOpened()):
    ret, frame = cap.read()
    if ret == True:
        frame = cv2.flip(frame, 0)
        gray = cv2.cvtColor(frame,  cv2.COLOR_BGR2GRAY)
        cv2.imshow('iframe', gray)
        out.write(gray)

        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    else:
        break
cap.release()
out.release()
cv2.destroyAllWindows()

說明

1.獲取視頻

cap = cv2.VideoCapture(0) #打開筆記本的內置攝像頭。
cap = cv2.VideoCapture('F:\aa.avi') #打開視頻文件

注意:若初始化攝像頭或者打開視頻文件不成功,opencv不會提示你。使用print cap.isOpened()查看,若返回值是True,則表明成功,否則返回值是False。

2. 讀入視頻

cap.read() 

按幀讀取視頻,它的返回值有兩個:ret, frame。其中ret是布爾值,如果讀取幀是正確的則返回True,如果文件讀取到結尾,它的返回值就爲False。frame就是每一幀的圖像,是個三維矩陣。

3. 播放視頻

cv2.imshow('iframe', gray) 

播放視頻,第一個參數是視頻播放窗口的名稱,第二個參數是視頻的當前幀。
cv2.waitKey(25) 每一幀的播放時間,毫秒級。

4. 停止捕獲視頻
本示例中有兩種停止捕獲視頻的方式:

if ret == True:    
frame = cv2.flip(frame, 0)   
gray = cv2.cvtColor(frame,  cv2.COLOR_BGR2GRAY)     
cv2.imshow('iframe', gray)    
out.write(gray) 

if cv2.waitKey(25) & 0xFF == ord('q'):       
   break
else:   
   break
通過外部鍵盤輸入
cv2.waitKey(25) & 0xFF == ord('q'):  
break

在25毫秒內如果鍵盤輸入了“q”,則停止捕獲視頻;
通過cap.read() 的返回值ret,若ret值爲False,則停止捕獲視頻。這種適合讀取視頻文件時進行判定,通過攝像頭錄像則只能通過第一種方式停捕獲視頻。

5. 視頻的一些處理方式

gray = cv2.cvtColor(frame,  cv2.COLOR_BGR2GRAY)

灰度圖
本例中是將攝像頭捕獲的視頻轉換爲灰色並且保存。
視頻旋轉 cv2.flip(frame, 0) 第一個參數表示要旋轉的視頻,第二個參數表示旋轉的方向,0表示繞x軸旋轉,大於0的數表示繞y軸旋轉,小於0的負數表示繞x和y軸旋轉。

6. 獲取視頻的參數信息
使用函數 cap.get(propId) 來獲得視頻的一些參數信息,使用cap.set(propId, value)設置視頻的一些參數信息,propId的值從0到18分別爲:

CV_CAP_PROP_POS_MSEC Current position of the video file in milliseconds or video capture timestamp.
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 視頻每一幀的寬。
CV_CAP_PROP_FRAME_HEIGHT 視頻每一幀的高。
CV_CAP_PROP_FPS 視頻的幀速。
CV_CAP_PROP_FOURCC 4個字符表示的視頻編碼器格式。
CV_CAP_PROP_FRAME_COUNT 視頻的幀數。
CV_CAP_PROP_FORMAT Format of the Mat objects returned byretrieve().
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 not supported
CV_CAP_PROP_RECTIFICATION Rectification flag for stereo cameras (note: only supported by DC1394 v 2.x backend currently)

注意:當你查詢的屬性是VideoCapture()不支持的屬性時,返回值爲0.

7. 保存視頻

out = cv2.VideoWriter(filePath, fourcc, 800, size) 

設置輸出視頻的名稱,視頻的格式,視頻的幀速,視頻的大小等。
fourcc = cv2.cv.FOURCC(*’CVID’) 設置要保存視頻的格式。

8.釋放對象和銷燬窗口

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

9.視頻寫入失敗
若生成的avi視頻字節爲0,是因爲操作系統缺少編碼器。在http://www.xvidmovies.com/codec/下載安裝。




參考文獻:

素素-opencv 利用電腦攝像頭捕獲圖像並保存

Setting Camera Parameters in OpenCV/Python

Python OpenCV access webcam maximum resolution

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