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.)
・ Diejenigen, die Videodaten in Intervallen verwenden, die größer als ein Bild sind. (Nur Lesen ist für jeden Frame geeignet)
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 |
Ü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
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}
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