[PYTHON] Beschleunigung des Lesevorgangs durch Angabe eines OpenCV-Frames

1. Zuallererst

Bei der Verwendung von mp4 mit OpenCV gab es das Phänomen, dass es langsam war, die Frame-Position mit set und read anzugeben. Da die Aufnahme des Videos in regelmäßigen Abständen (alle 0,5 Sekunden) zu lange gedauert hat, werden die Gegenmaßnahmen nachfolgend beschrieben. (Wenn Sie andere bessere Mittel haben, lassen Sie es mich bitte in den Kommentaren wissen.)

2. Für Leser

・ Diejenigen, die Videodaten in Intervallen verwenden, die größer als ein Bild sind. (Nur Lesen ist für jeden Frame geeignet)

3. Fazit

Verwenden Sie Grab, um unnötige Frames zu überspringen und zu lesen, um die erforderlichen Frames zu erhalten.

36% der Zeit konnten eingespart werden.

Bedingungen Verarbeitungszeit(Sekunden)
set + read 10.131
grab + read 6.491

4. Überprüfung

Überprüfungsziel:  Luis Fonsi - Despacito ft. Daddy Yankee  720p 30fps Videozeit 4 Minuten 41 Sekunden

Bei Verwendung von OpenCV :: VideoCapture zum Erfassen von Bildern pro Sekunde

  1. set + read
  2. grab + read

Messen Sie die Verarbeitungszeit von 2 Mustern.

Überprüfungsumgebung Windows10 64bit Python 3.6.9 OpenCV 4.1.1 numpy 1.16.5


1. set + read Ergebnis 10.131 Sekunden

set+read


import cv2


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

#Holen Sie sich die Anzahl der Frames
frame_count = int(video.get(7))

#Bildrate(Die Zeiteinheit eines Frames ist Millisekunde)Erhalten
frame_rate = int(video.get(5))

#Alle n Sekunden
n = 1

#Gesamtzahl der erfassten Frames
frame_all = int((frame_count / frame_rate) / n)

for i in range(frame_all):  #Drehen Sie um die Gesamtzahl der erfassten Frames
    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

    #Hier ist die Verarbeitung für den Frame

video.release()

set+Ergebnis lesen


         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

Ergebnis 6,491 Sekunden

grab+read


import cv2


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

#Holen Sie sich die Anzahl der Frames
frame_count = int(video.get(7))

#Bildrate(Die Zeiteinheit eines Frames ist Millisekunde)Erhalten
frame_rate = int(video.get(5))

#Alle n Sekunden
n = 1

#Intervalleinstellung lesen
read_interval = int((frame_rate * n) - 1)

for i in range(frame_count):  #Drehen Sie für ein paar Frames
    ret = video.grab()
    if ret is False:
        break

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

        #Hier ist die Verarbeitung für den Frame

video.release()

grab+Ergebnis lesen


         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. Schlussfolgerung

Danke, dass du bis zum Ende zugesehen hast. Dieser Vorgang ist ungefähr 3 Sekunden kürzer als das 4-minütige Video, daher denke ich nicht, dass es zu groß ist.

・ Analysieren Sie lange Videos ・ Szene, in der Spezifikationen wie Mietserver begrenzt sind

Dann scheint es, dass es effektiver sein kann.

Recommended Posts

Beschleunigung des Lesevorgangs durch Angabe eines OpenCV-Frames
Speichern Sie Videos Frame für Frame mit Python OpenCV
Lesen Sie die OpenCV-Dokumentation
JPEG-Bilderzeugung durch Angabe der Qualität mit Python + OpenCV
Verbessern Sie schnell die Erkennungsgenauigkeit, indem Sie Parameter mit openCV-Gesichtserkennung angeben
Template Matching von OpenCV (CUDA)
Affine Transformation durch OpenCV (CUDA)