import cv2
# 選擇第1隻攝影機
cap = cv2.VideoCapture(0)
# 從攝影機擷取一張影像
ret, frame = cap.read()
# 在圖片上畫一條紅色的對角線,寬度為 5 px
cv2.line(frame, (0, 0), (255, 255), (0, 255, 255), 5)
# 寫入圖檔
cv2.imwrite("oc01.png", frame)
# 釋放攝影機
cap.release()
cv2.destroyAllWindows()
 | 
import cv2
cap = cv2.VideoCapture(0)
# 設定擷取影像的尺寸大小
# 800x600, 1024x768, 1280x720(HD720), 1920x1080(HD1080)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)
def decode_fourcc(v):
  v = int(v)
    return "".join([chr((v >> 8 * i) & 0xFF) for i in range(4)])
    # 取得影像的尺寸大小
    w = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
    h = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
    print("Image Size: %d x %d" % (w, h))
    # 取得 Codec 名稱
    fourcc = cap.get(cv2.CAP_PROP_FOURCC)
    codec = decode_fourcc(fourcc)
    print("Codec: " + codec)
    cap.release()
 | 
Image Size: 1280 x 720 Codec: YUYV  | 
import cv2
# 開啟影片檔案
cap = cv2.VideoCapture('firework.mp4')
# 以迴圈從影片檔案讀取影格,並顯示出來
while(cap.isOpened()):
    ret, frame = cap.read()
    # 從檔案輸入的影格可以imshow直接顯示
    if(ret): 
        cv2.imshow('frame',frame)
    else: break
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
print('cap done')
cv2.destroyAllWindows()
cap.release()
 | 
import cv2
cap = cv2.VideoCapture('firework.mp4')
# 取得影像的尺寸大小
w = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
h = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
# 記得長寬要先改成整數
print(type(w)); w=int(w); h=int(h)
print("Image Size: %d x %d" % (w, h))
# 使用 XVID 編碼
fourcc = cv2.VideoWriter_fourcc(*'XVID')
# FPS 值為 20.0,解析度為 w x h
# 要寫成灰階輸出的檔案必須在長寬(w,h)之後加個零 ,0)
out = cv2.VideoWriter('oc04d.avi', fourcc, 20.0, (w,h),0)
while(cap.isOpened()):
  ret, frame = cap.read()
  if ret == True:
    # 轉為灰階並寫入
    frame2 = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    out.write(frame2)
    #cv2.imshow('frame',frame2)
    if cv2.waitKey(1) & 0xFF == ord('q'):
      break
  else:
    break
# 釋放所有資源
cap.release()
out.release()
cv2.destroyAllWindows()
 | 
import cv2
vid='FULL15'
fn=vid+'.mp4'
cap = cv2.VideoCapture(fn)
NF=0
while True:
    ret,frame = cap.read()
    NF+=1
    if(ret): 
        cv2.imshow('frame',frame)
        fw=vid+'_'+str(NF).zfill(3)+'.png'
        cv2.imwrite(fw,frame)
        print(NF,fw)
    else: break
    if cv2.waitKey(1) & 0xFF == ord('q'): break
print('cap done')
cv2.destroyAllWindows()
cap.release()
 | 
import cv2
import time
mp4='FULL15'
sec=23
dir=mp4+'/FULL15_'
fn=mp4+'.mp4'
cap = cv2.VideoCapture(fn)
fps = cap.get(cv2.CAP_PROP_FPS)
size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)),
        int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
length = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
print(fn,': fps=',fps,' size=',size,' sec=',sec,' length=',length)
fps=int(length/sec); spf=round(sec/length,3)
ds=0.1; SR=int(ds/spf)
print( length,'estimated from total length, FR=',fps,' spf=',spf,' SR=',SR)
def FR(cap):
    # Number of frames to capture
    num_frames = 120;
    print("Capturing {0} frames".format(num_frames))
    start = time.time()
    for i in range(0, num_frames) :
        ret, frame = cap.read()
    end = time.time()
    seconds = end - start
    print ("Time taken : {0} seconds".format(seconds))
    fps  = num_frames / seconds
    print("Estimated from 120 frames, fps= : {0}".format(fps))
FR(cap)
NR=0; NF=0
while(cap.isOpened()):
    ret, frame = cap.read()        
    NR+=1
    if(ret): 
        cv2.imshow('frame',frame)
        if(NR%SR==0):
            NF+=1
            cv2.imwrite(dir+str(NF).zfill(3)+".jpg",frame)
            print('NR=',NR,' NF=',NF)
    else: break
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
print('cap done')
cv2.destroyAllWindows()
cap.release()
 | 
import cv2
cap = cv2.VideoCapture(0)
# 設定擷取影像的尺寸大小
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 360)
# 使用 XVID 編碼
fourcc = cv2.VideoWriter_fourcc(*'XVID')
# 建立 VideoWriter 物件,輸出影片至 output.avi
# FPS 值為 20.0,解析度為 640x360
out = cv2.VideoWriter('oc04.avi', fourcc, 20.0, (640, 360))
t=0
while(t<400 and cap.isOpened()):
  #if(t%100 == 0): print(t)
  ret, frame = cap.read()
  t+=1
  if ret == True:
    # 寫入影格
    out.write(frame)
    #cv2.imshow('frame',frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
      break
  else:
    break
# 釋放所有資源
cap.release()
out.release()
cv2.destroyAllWindows()
 | 
import cv2
import time
cap = cv2.VideoCapture(0)
# 設定擷取影像的尺寸大小
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 360)
# 使用 XVID 編碼
fourcc = cv2.VideoWriter_fourcc(*'XVID')
# 建立 VideoWriter 物件,輸出影片至 output.avi
# FPS 值為 20.0,解析度為 640x360
out = cv2.VideoWriter('output2.avi', fourcc, 20.0, (640, 360))
t=0
while(t<400 and cap.isOpened()):
  ret, frame = cap.read()
  if ret == True:
    # 寫入影格
    #print('t=',t,ret)
    out.write(frame)
    #cv2.imshow('frame',frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
      break
  else:
    break
  t+=1
# 釋放所有資源
cap.release()
out.release()
cv2.destroyAllWindows()
 | 
import cv2
cap = cv2.VideoCapture('firework-2.mp4')
while(cap.isOpened()):
  ret, frame = cap.read()
  frame2=cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
  cv2.imshow('frame',frame2)
  if cv2.waitKey(1) & 0xFF == ord('q'):
    break
cap.release()
cv2.destroyAllWindows()
 | 
import cv2
import numpy as np
import os
# 影片檔案
videoFile = "op4B.avi"
# 輸出目錄
outputFolder = "my_output"
# 自動建立目錄
if not os.path.exists(outputFolder):
  os.makedirs(outputFolder)
# 開啟影片檔
cap = cv2.VideoCapture(videoFile)
# 取得畫面尺寸
width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
# 計算畫面面積
area = width * height
# 初始化平均畫面
ret, frame = cap.read()
avg = cv2.blur(frame, (4, 4))
avg_float = np.float32(avg)
# 輸出圖檔用的計數器
outputCounter = 0
while(cap.isOpened()):
  # 讀取一幅影格
  ret, frame = cap.read()
  # 若讀取至影片結尾,則跳出
  if ret == False:
    break
  # 模糊處理
  blur = cv2.blur(frame, (4, 4))
  # 計算目前影格與平均影像的差異值
  diff = cv2.absdiff(avg, blur)
  # 將圖片轉為灰階
  gray = cv2.cvtColor(diff, cv2.COLOR_BGR2GRAY)
  # 篩選出變動程度大於門檻值的區域
  ret, thresh = cv2.threshold(gray, 25, 255, cv2.THRESH_BINARY)
  # 使用型態轉換函數去除雜訊
  kernel = np.ones((5, 5), np.uint8)
  thresh = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=2)
  thresh = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel, iterations=2)
  # 產生等高線
  cntImg, cnts, _ = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
  hasMotion = False
  for c in cnts:
    # 忽略太小的區域
    if cv2.contourArea(c) < 2500:
      continue
    hasMotion = True
    # 計算等高線的外框範圍
    (x, y, w, h) = cv2.boundingRect(c)
    # 畫出外框
    cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
  if hasMotion:
    # 儲存有變動的影像
    cv2.imwrite("%s/output_%04d.jpg" % (outputFolder, outputCounter), frame)
    outputCounter += 1
  # 更新平均影像
  cv2.accumulateWeighted(blur, avg_float, 0.01)
  avg = cv2.convertScaleAbs(avg_float)
cap.release()
 |