Ich wollte einmal wissen, "zu welcher Zeit" und "welche Art von Person herauskommt" im Video. Ich habe mit wxpython und openCV ein einfaches Videoanalyse-Tool erstellt, das ich studiert habe. Ich werde es hier als Memo für mich vorstellen.
Hier herunterladen GitLab ChuntaMovieAnalyzer
Zunächst vom Demo-Bildschirm des Tools. Geben Sie das Video an und geben Sie den HTML-Bericht aus. Jede Sekunde des Videos wird ein menschliches Gesicht extrahiert und angezeigt. Sie können das Intervall zwischen Sekunden und der maximalen Anzahl von Personen ändern, die in der GUI extrahiert werden sollen.
Hier herunterladen GitLab ChuntaMovieAnalyzer
Die zur Analyse des Videos verwendete Bibliothek ist openCV. Dieses Mal wird ein Bild des Videos als Bilddaten verwendet. Das Gesicht wird anhand der Bilddaten erkannt und zugeschnitten. Die zugeschnittenen Daten werden als Bild für HTML ausgegeben. Ich werde den Code des Teils einführen, der der Punkt zu sein scheint.
Das Video wird in Intervallen der angegebenen Anzahl von Sekunden geladen und verarbeitet, wobei die Gesamtzahl der Bilder des Videos und fps (Anzahl der Bilder pro Sekunde) verwendet werden.
def get_sampling_data_list(self, movie_path, report_path, interval_time, max_human, is_advance):
sampling_data_list = []
cap = cv2.VideoCapture(movie_path)
if not cap.isOpened():
print('cannot open movie file.')
return []
#Ermitteln Sie die Gesamtzahl der Frames
all_frame_cnt = cap.get(cv2.CAP_PROP_FRAME_COUNT)
#Berechnen Sie die Anzahl der zu tastenden Bilder aus der Bildrate
fps = cap.get(cv2.CAP_PROP_FPS)
sampling_frame_num = math.floor( fps * interval_time )
frame_cnt = 1
while True:
cap.set(cv2.CAP_PROP_POS_FRAMES, frame_cnt)
ret, frame = cap.read()
if ret:
sampling_data = self.get_sampling_data(frame, frame_cnt, fps, report_path, max_human, is_advance)
sampling_data_list.append(sampling_data)
frame_cnt = frame_cnt + sampling_frame_num
else:
break
return sampling_data_list
1 Bild in Bilddaten konvertieren ⇒ Gesicht aus Bilddaten erkennen ⇒ Trimmen ⇒ Als Bild für HTML ausgeben Die Verarbeitung erfolgt in der Reihenfolge.
def get_sampling_data(self, frame, frame_cnt, fps, report_path, max_human, is_advance):
data = sampling_data(frame_cnt, fps)
face_cascade = cv2.CascadeClassifier(resourcePath('cascade/haarcascade_frontalface_default.xml'))
src_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faceInfoList = face_cascade.detectMultiScale(src_gray)
human_cnt = 0
for x, y, w, h in faceInfoList:
#Verlassen Sie die Schleife, wenn die maximale Anzahl von Personen überschritten wird
if human_cnt >= max_human:
break
#Trimmen
img_trim = frame[y:(y + h), x:(x + w)]
data2 = None
data2 = human_data()
#Erstellen Sie einen Ordner für die Bildausgabe
if False == os.path.exists(report_path + '/img'):
os.mkdir(report_path + '/img')
#Bildausgabe
file_name = str(frame_cnt) + '_' + str(human_cnt) + '.jpg'
cv2.imwrite(report_path + '/img/' + file_name, img_trim)
data2.set_img_src(report_path, file_name)
data.append_human_data(data2)
human_cnt = human_cnt + 1
return data
Die Quelle des GUI-Teils. Ich werde den Code des Teils einführen, der der Punkt zu sein scheint.
Da der Videoanalyseprozess einige Zeit in Anspruch nimmt, ist er beschäftigt, sofern er nicht asynchron aufgerufen wird. Um dies zu vermeiden, ist der aufrufende Teil asynchron.
import threading
#Thread Kick, um zu verhindern, dass der Bildschirm einfriert, da die Verarbeitung lange dauert
analysis_thread = threading.Thread(target=exec_analyze, args=(self.analysis, self.btn, movie_path, interval_time, max_human, is_advance, token, report_path))
analysis_thread.start()
def exec_analyze(analysis, btn, movie_path, interval_time, max_human, is_advance, token, report_path):
analysis.analyze(movie_path, int(interval_time), int(max_human), is_advance, token, report_path)
wx.MessageBox('Die HTML-Datei wurde in den angegebenen Ordner ausgegeben.', 'Bearbeitung abgeschlossen')
Ich habe Pyinstaller bei der Konvertierung in exe verwendet. Es war notwendig zu entwickeln, wenn die externe Ressource in exe eingeschlossen wurde. Es wurde unter Bezugnahme auf die folgende Stelle durchgeführt.
Referenzierte URL Erstellen Sie mit Pyinstaller eine Exe mit Ressourcen
Führen Sie an der Eingabeaufforderung Folgendes aus
pyinstaller --onefile --icon=icon.ico -n chuntaMovieAnalyzer view_gui.py
Bearbeiten Sie die erstellte Spezifikationsdatei und führen Sie an der Eingabeaufforderung erneut Folgendes aus
pyinstaller chuntaMovieAnalyzer.spec
Hier herunterladen GitLab ChuntaMovieAnalyzer
Recommended Posts