1
votes

Python: extraire des images 'n' de différentes longueurs de vidéo

Je veux extraire un nombre constant d'images «n» à partir de plusieurs longueurs de vidéo en utilisant Python et opencv. Comment faire cela en utilisant opencv avec Python?

par exemple dans une vidéo de 5 secondes, je souhaite extraire uniformément 10 images de cette vidéo.


2 commentaires

Lisez toutes les images de la vidéo dans un tableau, puis découpez-les.


Comment effectuer cette action de tranchage


3 Réponses :


0
votes

Code adopté à partir de: Comment transformer une vidéo en tableau numpy?

import numpy as np
import cv2

cap = cv2.VideoCapture('sample.mp4')
frameCount = 10
frameWidth = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
frameHeight = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))

buf = np.empty((frameCount, frameHeight, frameWidth, 3), np.dtype('uint8'))

fc = 0
ret = True

while (fc < frameCount  and ret):
    ret, buf[fc] = cap.read()
    fc += 1

cap.release()
print(buf.shape) # (10, 540, 960, 3)


0 commentaires

0
votes

Vous pouvez obtenir le nombre total d'images, le diviser par n pour avoir le nombre d'images que vous sauterez à chaque étape, puis lire les images

    vidcap = cv2.VideoCapture(video_path)
    total_frames = vidcap.get(cv2.CAP_PROP_FRAME_COUNT)
    frames_step = total_frames//n
    for i in range(n):
        #here, we set the parameter 1 which is the frame number to the frame (i*frames_step)
        vidcap.set(1,i*frames_step)
        success,image = vidcap.read()  
        #save your image
        cv2.imwrite(path,image)
    vidcap.release()


3 commentaires

Je ne peux juste pas sortir 1 image


Je ne vous ai pas bien compris. Pourriez-vous donner plus de détails sur le problème que vous avez rencontré avec cela?


@laihang Si vous souhaitez obtenir plusieurs cadres, vous pouvez essayer ma réponse.



0
votes

vous pouvez essayer cette fonction:

''' to get the constant frames from varying number of frames, call the rescaleFrame() function '''
outputFrames = rescaleFrames(inputBatch=frames, scaleFactor = 45)

''' read the frames from the video '''
frames = []
cap = cv2.VideoCapture('sample.mp4')
ret, frame = cap.read()
while True:
   if not ret:
       print('no frames')
       break
   
   ret, frame = cap.read()
   frames.append(frame)

def rescaleFrame(inputBatch, scaleFactor = 50):
    ''' returns constant frames for any length video 
        scaleFactor: number of constant frames to get.  
        inputBatch : frames present in the video. 
    '''
    if len(inputBatch) < 1:
        return
    """ This is to rescale the frames to specific length considering almost all the data in the batch  """ 
    skipFactor = len(inputBatch)//scaleFactor
    return [inputBatch[i] for i in range(0, len(inputBatch), skipFactor)][:scaleFactor]

Sortie : Cela renverra 45 images en sortie constante.


0 commentaires