簡體   English   中英

我的python代碼不會將視頻幀保存為圖像

[英]My python code doesn't save video frames as images

我試圖在視頻中抓取特定的幀(例如幀0,10,20,......)並使用Python和CV2將它們保存為圖像。 由於某些原因,我的代碼只保存第一幀。 創建所有其他幀,但大小為0(它們已損壞)。

我該如何解決這個問題?

import cv2
from numpy import integer

number = 10;
filename = "18s.mp4";

def uniform():
    cap = cv2.VideoCapture(filename);
    frame_count= int(cap.get(cv2.CAP_PROP_FRAME_COUNT));
    print(frame_count)

    for x in range(0, number):
            frame_no = 1*(x/number)
            frame_no_int=int(frame_no*frame_count)

            cap.set(2,frame_no);
            ret, frame = cap.read()
            cv2.imwrite(filename+'_frame_'+str(frame_no_int)+'.jpg', frame);

    # When everything done, release the capture
    cap.release()

if __name__ == '__main__':
    uniform()

顯然, CAP_PROP_POS_AVI_RATIO (常量2,你在cap.set()中使用的)不能正常工作。 看一下修改過的腳本的輸出:

import cv2
from numpy import integer

number = 10
filename = 'chaplin.mp4'

def uniform():
    cap = cv2.VideoCapture(filename)
    frame_count= int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
    print(frame_count)

    for x in range(0, number):
        frame_pos_ratio = 1.0*x/number
        frame_no_int=int(frame_pos_ratio*frame_count)
        cap.set(cv2.CAP_PROP_POS_FRAMES, frame_no_int)
        print (frame_no_int, cap.get(cv2.CAP_PROP_POS_AVI_RATIO))
        ret, frame = cap.read()
        cv2.imwrite('_frame_'+str(frame_no_int)+'.jpg', frame)

    # Attempt to go the end of film
    cap.set(cv2.CAP_PROP_POS_AVI_RATIO, 1)
    print (cap.get(cv2.CAP_PROP_POS_FRAMES))

    # When everything done, release the capture
    cap.release()

if __name__ == '__main__':
    uniform()

輸出:

172
(0, 6.510416666666667e-05)
(17, 6.510416666666667e-05)
(34, 6.510416666666667e-05)
(51, 6.510416666666667e-05)
(68, 6.510416666666667e-05)
(86, 6.510416666666667e-05)
(103, 6.510416666666667e-05)
(120, 6.510416666666667e-05)
(137, 6.510416666666667e-05)
(154, 6.510416666666667e-05)
150.0

如您所見,循環內的cap.get(cv2.CAP_PROP_POS_AVI_RATIO)只返回一個常量6.51e-05

即使有174幀, cap.set(cv2.CAP_PROP_POS_AVI_RATIO, 1)也只帶你到第150幀,這絕對是一個錯誤。

此行為符合此問題

PS有趣的是,即使cv2.CAP_PROP_FRAME_COUNT也無法正常工作。 顯然,我的視頻文件只包含150幀,但它們的編號從22到171,如ffprobe -show_frames chaplin.mp4 | grep coded_picture_number ffprobe -show_frames chaplin.mp4 | grep coded_picture_number 所以CAP_PROP_FRAME_COUNT的輸出只是max(frame_no)+1。

暫無
暫無

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

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