利用python-opencv生成視頻幀數控制,和常見錯誤總結


首先呢 利用opencv生成視頻的例子相信網絡上已經很多了。但是大多數例子都只是捕獲一個攝像頭就沒了。但是在實際運用中會發現。因為涉及到圖像處理,生成的視頻要不就就是過快要不就是比實際時間長。

控制視頻的幀數,捕獲攝像頭和生成圖像都適用

關鍵在於在生成一幀的時候與下一幀的間隔時間。中間圖像處理會造成延遲所以說會造成視頻時間比預想的長

 #計算處理時間
    sleeptime = time.time() - now
    #計算每一幀要延遲的時間
    sleeptime = 1 / fps - sleeptime

 

import time
import datetime
import cv2

#生成一個視頻
fps = 30.0  # 視頻幀率
size = (289, 419)
baseimgpath = "/root/1.jpg"
save_path = "/root/"
flag = True
fourcc = cv2.VideoWriter_fourcc(*'X264')
file = save_path + datetime.datetime.now().strftime('%Y-%m-%d-%H-%M-%S') + ".mp4"
videoWriter = cv2.VideoWriter(file, fourcc, fps, size)
while flag:
    now = time.time()
    baseimg = cv2.imread(baseimgpath)
    #這里的數據通過緩存服務器獲取
    ret = mc.get('info')
    rpm = str(ret["carstate"]["RPM"]) + "r/min"
    speed = str(ret["carstate"]["SPEED"]) + "km/h"
    COOLANT_TEMP = str(ret["carstate"]["COOLANT_TEMP"])
    fuel = str(ret["carstate"]["FUEL"])
    ENGINE_LOAD = str(round(ret["carstate"]["ENGINE_LOAD"], 1)) + "%"
    v = str(12.2) + "V"
    cv2.putText(baseimg, rpm, (130, 73), cv2.FONT_HERSHEY_PLAIN, 1.8, (0, 0, 0), 2, cv2.LINE_AA)
    cv2.putText(baseimg, COOLANT_TEMP, (50, 150), cv2.FONT_HERSHEY_PLAIN, 1.8, (0, 0, 0), 1, cv2.LINE_AA)
    cv2.putText(baseimg, fuel, (180, 150), cv2.FONT_HERSHEY_PLAIN, 1.8, (0, 0, 0), 1, cv2.LINE_AA)
    cv2.putText(baseimg, ENGINE_LOAD, (50, 270), cv2.FONT_HERSHEY_PLAIN, 1.8, (0, 0, 0), 1, cv2.LINE_AA)
    cv2.putText(baseimg, v, (180, 270), cv2.FONT_HERSHEY_PLAIN, 1.8, (0, 0, 0), 1, cv2.LINE_AA)
    videoWriter.write(baseimg)

    #計算處理時間
    sleeptime = time.time() - now
    #計算每一幀要延遲的時間
    sleeptime = 1 / fps - sleeptime
    #暫停時間
    if sleeptime > 0:
        time.sleep(sleeptime)
    # time.sleep(1 / fps)
videoWriter.release()
cv2.destroyAllWindows()

 

利用隊列多進程處理

對於多視頻處理這個大佬講的已經很詳細了

https://zhuanlan.zhihu.com/p/38136322

常見問題

生成的視頻特別小

這種一般是編碼器沒有選擇對造成的,看看你電腦支不支持該編碼,還有一種情況是攝像頭問題比如。只支持30fps的攝像頭要輸出60fps的視頻或者輸出攝像頭沒有的分辨率

#可以這樣獲取 cap = cv2.VideoCapture(1) fps = cap.get(cv2.CAP_PROP_FPS) w = int(cap.get(3)) h = int(cap.get(4)) 

生成的視頻過快或過慢

這個和處理能力有關。但凡造成延遲的操作就會造成這樣的結果。所以說盡量控制幀數。用cpu占用少的編碼器,降低視頻分辨率等等。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM