OpenCV+Python程式設計筆記1
阿新 • • 發佈:2018-12-03
1. OpenvCV讀/寫視訊檔案
import cv2 videoCapture = cv2.VideoCapture('MyInputVid.avi') fps = videoCapture.get(cv2.cv.CV_CAP_PROP_FPS) size = (int(videoCapture.get(cv2.cv.CV_CAP_PROP_FRAME_WIDTH)), int(videoCapture.get(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT))) videoWriter = cv2.VideoWriter('MyOutputVid.avi', cv2.cv.CV_FOURCC('I', '4', '2', '0'), fps, size) #YUV編碼格式 success, frame = videoCapture.read() while success: # Loop until there are no more frames. videoWriter.write(frame) success, frame = videoCapture.read()
寫視訊檔案時可用的編碼格式如下:
cv2.cv.CV_FOURCC('I','4','2','0') : YUV 4:2:0(.avi)
cv2.cv.CV_FOURCC('P','I','M','1') : MPEG-1(.avi)
cv2.cv.CV_FOURCC('M','J','P','G') : motion-JPEG(.avi)
cv2.cv.CV_FOURCC('T','H','E','O') : Ogg-Vorbis(.ogv)
cv2.cv.CV_FOURCC('F','L','V','1') : Flash video(.flv)
2. 捕獲視訊幀
import cv2 cameraCapture = cv2.VideoCapture(0) fps = 30 # an assumption size = (int(cameraCapture.get(cv2.cv.CV_CAP_PROP_FRAME_WIDTH)), int(cameraCapture.get(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT))) videoWriter = cv2.VideoWriter('MyOutputVid.avi', cv2.cv.CV_FOURCC('I','4','2','0'), fps, size) success, frame = cameraCapture.read() numFramesRemaining = 10 * fps - 1 while success and numFramesRemaining > 0: videoWriter.write(frame) success, frame = cameraCapture.read() numFramesRemanining -= 1
videoCapture.get()方法往往獲取不到正確的fps,這裡給定一個估計值。
若讀取不到視訊幀時會返回(false, None)。
read()方法對獲取一組攝像機的視訊幀時使用不夠恰當,需要使用grab()和retrieve()方法代替。
success0 = cameraCapture0.grab()
success1 = cameraCapture1.grab()
if success0 and success1:
frame0 = cameraCapture0.retrieve()
frame1 = cameraCapture1.retrieve()
對於一個多路攝像機,需要在retrieve()中指明每路的index:
success = multiHeadCameraCapture.grab()
if success:
frame0 = multiHeadCameraCapture.retrieve(channel = 0)
frame1 = multiHeadCameraCapture.retrieve(channel = 1)
3.在視窗中顯示視訊幀
import cv2
clicked = False
def onMouse(event, x, y, flags, param):
global clicked
if event == cv2.cv.CV_EVENT_LBUTTONUP:
click = True
cameraCapture = cv2.VideoCapture(0)
cv2.namedWindow('MyWindow')
cv2.setMouseCallback('MyWindow', onMouse)
print 'Showing camera feeed. Click window or press any key to stop.'
success, frame = cameraCapture.read()
while success and cv2.waitKey(1) == -1 and not clicked:
cv2.imshow('MyWindow', frame)
success, frame = cameraCapture.read()
cv2.destroyWindow('MyWindow')
Python提供一個標準函式ord()將字元轉換為ASCII碼,ord('a') = 97