簡體   English   中英

更改 OpenCV 中的 FPS,以便只保存那些幀

[英]Changing FPS in OpenCV so that only those frames are saved

我有一個技術應用程序需要每秒捕獲幾幀。 將以下代碼中的視頻編寫器設置為每秒 3 幀會導致保存網絡攝像頭大約 30 fps 的正常幀速率。 有什么選項可以保存每秒錄制的3幀,而讓其他27幀左右go? 提前致謝。

import cv2
import numpy as np
import time
import datetime
import pathlib
import imutils

cap = cv2.VideoCapture(0)

if (cap.isOpened() == False): 
  print("Unable to read camera feed")

capture_duration = 15
frame_per_sec = 3
frame_width = 80
frame_height = 60

out = cv2.VideoWriter('C:\\Users\\student\\Desktop\\videoFile.avi',cv2.VideoWriter_fourcc('m','j','p','g'),frame_per_sec, (frame_width,frame_height))

start_time = time.time()
while( int(time.time() - start_time) < capture_duration ):
    ret, frame = cap.read()
    if ret==True:
        frame = imutils.resize(frame, width=frame_width)
        out.write(frame)
        cv2.imshow('frame',frame) 
        if cv2.waitKey(1) & 0xFF == ord('q'):
          break
    else:
        break

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

您通過VideoWriter為 output 設置 FPS,
但您沒有嘗試通過VideoCapture為輸入設置 FPS。

為此,您可以在創建cap后嘗試使用cv2.CAP_PROP_FPS屬性調用cv2.VideoCapture
例如:

cap.set(cv2.CAP_PROP_FPS, 3)

但是- 請注意,實際行為取決於您使用的特定捕獲設備。 有些僅支持某些 FPS。 另請參閱此帖子: 在 opencv 3.4.2 中更改幀速率

如果它確實有效,您將能夠大大簡化您的代碼 - 只需捕獲幀,處理它們並保存(無需任何手動 fps 管理)。

此方法以編程方式設置每秒幀數。 當幀速率設置為 30fps 時創建一個 6.1mb 文件,設置為 3fps 時創建一個 0.9mb 文件。

#!/usr/bin/env python3

import cv2
import numpy as np
import time
import datetime
import pathlib
import imutils

cap = cv2.VideoCapture(0)

if (cap.isOpened() == False): 
  print("Unable to read camera feed")

capture_duration = 15
frame_per_sec = 30
prev = 0
frame_width = int(cap.get(3))
frame_height = int(cap.get(4))

out = cv2.VideoWriter('C:\\videoPy\\LZ\\'outpout.avi',cv2.VideoWriter_fourcc('m','j','p','g'),frame_per_sec, (frame_width,frame_height))

start_time = time.time()
while( int(time.time() - start_time) < capture_duration ): 
#start fps
  time_elapsed = time.time() - prev
  while(time_elapsed > 1./frame_per_sec):                   
        ret, frame = cap.read()
        if not ret:
            break
        if time_elapsed > 1./frame_per_sec:
          prev = time.time()
#end fps
        if ret==True:
          frame = imutils.resize(frame, width=frame_width)
          out.write(frame)
          cv2.imshow('frame',frame) 
        if cv2.waitKey(1) & 0xFF == ord('q'):
          break
        else:
           break

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM