我試圖使用cv2.VideoCapture. 但是,我發現以下兩種方法都成功讀取了影像,但是影像不同。我想知道哪種是讀取第 600 幀的正確方法,為什么結果影像不同?它與mp4編碼有關嗎?謝謝!
方法#1
cap = cv2.VideoCapture("test.mp4")
print(cap.get(cv2.CAP_PROP_FRAME_COUNT)) # 1187
cap.set(1, 600)
ret, frame1 = cap.read() # Read the frame
方法#2
cap = cv2.VideoCapture("test.mp4")
print(cap.get(cv2.CAP_PROP_FRAME_COUNT)) # 1187
for i in range(601):
ret, frame2 = cap.read() # Read the frame
uj5u.com熱心網友回復:
要讀取/獲取視頻的X第 th 幀或類似地確定視頻檔案中的幀數,有兩種方法:
- 方法 #1:利用內置 OpenCV 屬性訪問視頻檔案元資訊,快速高效但不準確
- 方法#2:使用一個緩慢且低效但準確的計數器手動回圈視頻檔案中的每一幀
方法 #1 速度很快,并且依賴于 OpenCV 的視頻屬性功能,該功能幾乎可以立即確定視頻檔案中的幀資訊。但是,由于它取決于您的 OpenCV 和視頻編解碼器版本,因此需要權衡準確性。從檔案中:
讀/寫屬性涉及很多層。沿著這條鏈可能會發生一些意想不到的結果。有效行為取決于設備硬體、驅動程式和 API 后端。
另一方面,手動計數每一幀直到我們達到所需的幀數將是 100% 準確的,盡管它會慢得多。這是一個示例來演示兩種方法之間的不一致行為。它默認嘗試執行方法#1,如果失敗,它將自動使用方法#2
def frame_count(video_path, manual=False):
def manual_count(handler):
frames = 0
while True:
status, frame = handler.read()
if not status:
break
frames = 1
return frames
cap = cv2.VideoCapture(video_path)
# Slow, inefficient but 100% accurate method
if manual:
frames = manual_count(cap)
# Fast, efficient but inaccurate method
else:
try:
frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
except:
frames = manual_count(cap)
cap.release()
return frames
基準
if __name__ == '__main__':
import timeit
import cv2
start = timeit.default_timer()
print('frames:', frame_count('testtest.mp4', manual=False))
print(timeit.default_timer() - start, '(s)')
start = timeit.default_timer()
print('frames:', frame_count('testtest.mp4', manual=True))
print(timeit.default_timer() - start, '(s)')
方法 #1 結果
frames: 3671
0.018054921 (s)
方法 #2 結果
frames: 3521
9.447095287 (s)
請注意這兩種方法如何相差 150 幀,并且Method #2 比 Method #1 慢得多。一般來說,如果您需要速度但愿意犧牲準確性,請使用方法#1。在您可以延遲但需要精確幀的情況下,請使用方法 #2。
所以結論是:當您使用cap.get或任何內置的 VideoCaptureProperties 時cv2.CAP_PROP_FRAME_COUNT,您實際上是在使用快速有效但不準確的方法 #1。在您的第一個示例中,當您嘗試使用 讀取精確幀時cap.set,您實際上得到的是接近所需X第幀而不是實際幀的“估計”X幀。相反,從您的第二個代碼片段中,您將手動逐幀瀏覽每一幀,因此當它落在X第 th 幀時,可以保證是準確的。這就是為什么當您嘗試使用每種方法讀取相同的幀號時,您可能會得到不同的影像。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/468866.html
上一篇:如何檢測與背景混合的物體?
下一篇:Python制作全息金字塔
