利用python-opencv生成視訊幀數控制,和常見錯誤總結
阿新 • • 發佈:2020-07-26
首先呢 利用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佔用少的編碼器,降低視訊解析度等等。