[PYTHON] Accélérer la lecture en spécifiant une trame OpenCV

1.Tout d'abord

Lors de l'utilisation de mp4 avec OpenCV, il y avait un phénomène selon lequel il était lent de spécifier la position du cadre avec set et read. Puisqu'il a fallu trop de temps pour acquérir la vidéo à intervalles réguliers (toutes les 0,5 seconde), les contre-mesures sont décrites ci-dessous. (Si vous avez d'autres meilleurs moyens, veuillez me le faire savoir dans les commentaires.)

2. Pour les lecteurs

・ Ceux qui utilisent des données vidéo à des intervalles supérieurs à une image. (Seule la lecture est appropriée pour chaque image)

3. Conclusion

Utilisez grab pour sauter les images inutiles et lire pour obtenir les images requises.

Il a été possible de gagner 36% du temps.

conditions temps de traitement(Secondes)
set + read 10.131
grab + read 6.491

4. Vérification

Objectif de vérification:  Luis Fonsi - Despacito ft. Daddy Yankee  720p 30fps Durée de la vidéo 4 minutes 41 secondes

Lors de l'utilisation d'OpenCV :: VideoCapture pour capturer des images toutes les secondes

  1. set + read
  2. grab + read

Mesurez le temps de traitement de 2 modèles.

Environnement de vérification Windows10 64bit Python 3.6.9 OpenCV 4.1.1 numpy 1.16.5


1. set + read Résultat 10,131 secondes

set+read


import cv2


movie_path = "./movie/Luis Fonsi - Despacito ft. Daddy Yankee.mp4"
video = cv2.VideoCapture(movie_path)

#Obtenez le nombre d'images
frame_count = int(video.get(7))

#fréquence d'images(L'unité de temps d'une image est la milliseconde)Avoir
frame_rate = int(video.get(5))

#Toutes les n secondes
n = 1

#Nombre total d'images acquises
frame_all = int((frame_count / frame_rate) / n)

for i in range(frame_all):  #Tourner par le nombre total d'images acquises
    frame_set = frame_rate * n * i
    if frame_set > frame_count:
        break

    video.set(1, frame_set)
    ret, work_frame = video.read()
    if ret is False:
        break

    #Voici le traitement de la trame

video.release()

set+lire le résultat


         569 function calls in 10.131 seconds

   Ordered by: internal time

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
      281    8.791    0.031    8.791    0.031 {method 'set' of 'cv2.VideoCapture' objects}
      281    1.248    0.004    1.248    0.004 {method 'read' of 'cv2.VideoCapture' objects}
        1    0.087    0.087   10.131   10.131 time_check.py:4(test)
        1    0.006    0.006    0.006    0.006 {method 'release' of 'cv2.VideoCapture' objects}
        1    0.000    0.000   10.131   10.131 <string>:1(<module>)
        1    0.000    0.000   10.131   10.131 {built-in method builtins.exec}
        2    0.000    0.000    0.000    0.000 {method 'get' of 'cv2.VideoCapture' objects}
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}

2. grab + read

Résultat 6,491 secondes

grab+read


import cv2


movie_path = "./movie/Luis Fonsi - Despacito ft. Daddy Yankee.mp4"
video = cv2.VideoCapture(movie_path)

#Obtenez le nombre d'images
frame_count = int(video.get(7))

#fréquence d'images(L'unité de temps d'une image est la milliseconde)Avoir
frame_rate = int(video.get(5))

#Toutes les n secondes
n = 1

#Lire le réglage de l'intervalle
read_interval = int((frame_rate * n) - 1)

for i in range(frame_count):  #Tournez pendant quelques images
    ret = video.grab()
    if ret is False:
        break

    if i % read_interval is 0:
        ret, work_frame = video.read()
        if ret is False:
            break

        #Voici le traitement de la trame

video.release()

grab+lire le résultat


         8437 function calls in 6.491 seconds

   Ordered by: internal time

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
     8149    5.154    0.001    5.154    0.001 {method 'grab' of 'cv2.VideoCapture' objects}
      281    1.232    0.004    1.232    0.004 {method 'read' of 'cv2.VideoCapture' objects}
        1    0.098    0.098    6.490    6.490 time_check_set.py:4(test)
        1    0.006    0.006    0.006    0.006 {method 'release' of 'cv2.VideoCapture' objects}
        1    0.000    0.000    6.490    6.490 <string>:1(<module>)
        1    0.000    0.000    6.491    6.491 {built-in method builtins.exec}
        2    0.000    0.000    0.000    0.000 {method 'get' of 'cv2.VideoCapture' objects}
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}

5. Conclusion

Merci d'avoir regardé jusqu'à la fin. Ce processus est d'environ 3 secondes plus court que la vidéo de 4 minutes, donc je ne pense pas qu'il soit trop gros.

・ Analyser de longues vidéos ・ Scène où les spécifications telles que le serveur de location sont limitées

Ensuite, il semble que cela puisse être plus efficace.

Recommended Posts

Accélérer la lecture en spécifiant une trame OpenCV
Enregistrer la vidéo image par image avec Python OpenCV
Lire la documentation OpenCV
Génération d'images JPEG en spécifiant la qualité avec Python + OpenCV
Améliorez rapidement la précision de détection en spécifiant les paramètres avec la détection de visage openCV
Correspondance de modèle par OpenCV (CUDA)
Transformation affine par OpenCV (CUDA)