簡體   English   中英

imshow() 與 opencv 所需的幀率

[英]imshow() with desired framerate with opencv

是否有任何解決方法如何使用具有特定幀率的cv2.imshow() 我通過 VideoCapture 捕獲視頻並對它們進行一些簡單的后處理(都在一個單獨的線程中,因此它加載隊列中的所有幀並且主線程不會因計算而變慢)。 我嘗試通過計算用於從隊列中“讀取”圖像的時間來修復幀速率,然后從一幀可用的毫秒數中減去該值:如果我有 50FPS 的輸入視頻並且我想實時播放它- 時間我做 1000/50 => 每幀 20 毫秒。 然后使用 cv2.WaitKey() 等待那個時間但是我仍然得到一些滯后的輸出。 哪個比源視頻慢

我不相信 opencv 中有這樣的功能,但也許您可以通過使用計時器添加動態等待時間來改進您的方法? timeit.default_timer()計算處理所需的時間,並從預期的幀率中減去該時間,並可能添加幾毫秒的緩沖區。

例如cv2.WaitKey((1000/50) - (time processing finished - time read started) - 10)

或者你可以有更嚴格的時間安排,例如script start time + frame# * 20ms - time processing finished

我沒有親自嘗試過,所以我不確定它是否真的有效,也可能值得檢查一下,所以數字不低於 1

我在我的一個項目中遇到了相同的視頻,其中我的源視頻具有 2 fps。 所以為了使用 cv2.imshow 以良好的方式顯示它,我在顯示幀之前使用了延遲功能。 它是一種黑客,但這個東西對我有用。 下面給出了這個 hack 的代碼。 希望你能從中得到一些幫助。 和平!

import cv2
import numpy as np
import time
cap = cv2.VideoCapture (0)

width = 400
height = 350

while True:
    ret, frame = cap.read()
    frame = cv2.resize(frame, (width, height))
    flipped = cv2.flip(frame, 1)
    framerot = cv2.rotate(frame, cv2.ROTATE_90_COUNTERCLOCKWISE)
    framerot = cv2.resize(framerot, (width, height))
    StackImg = np.hstack([frame, flipped, framerot])
    #Put time of sleep according to your fps
    time.sleep(2)
    cv2.imshow("ImageStacked", StackImg)
    if cv2.waitKey(1) & 0xff == ord('q'):
        break
cv2.destroyAllWindows()

暫無
暫無

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

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