python wxpython + openCV로 간단한 동영상 분석 도구 만들기
아젠다
소개
동영상 중의 「어느 시간에」 「어떤 인물이 나오는지」를 알고 싶다고 생각한 적이 있고,
공부하고 있던 wxpython과 openCV로 간단한 동영상 해석 툴을 작성해 보았습니다.
자신의 메모도 겸해, 여기서 소개하겠습니다.
다운로드는 이쪽으로부터
GitLab ChuntaMovieAnalyzer
완성된 도구 데모
우선 도구의 데모 화면에서.
동영상을 지정하여 HTML 보고서를 출력합니다.
동영상의 초수마다 인간의 얼굴을 추출하여 표시하고 있습니다.
GUI에서 초 수의 간격과 추출할 최대 인원수를 변경할 수 있습니다.
다운로드는 이쪽으로부터
GitLab ChuntaMovieAnalyzer
openCV에서 동영상 분석
동영상을 분석할 때 사용한 라이브러리는 openCV입니다.
이번에는 동영상의 1 프레임을 이미지 데이터로 만들고,
이미지 데이터에서 얼굴을 감지하고 자르고 있습니다.
트리밍한 데이터는 html용 이미지로 출력하고 있습니다.
포인트라고 생각되는 부분의 코드에 대해 소개합니다.
동영상을 로드하여 이미지 출력
동영상을 로드하고 동영상의 총 프레임수와 fps(초당 프레임수)를 이용하여 지정된 초수 간격마다 처리를 하고 있습니다.
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 []
# 総フレーム数を取得
all_frame_cnt = cap.get(cv2.CAP_PROP_FRAME_COUNT)
# フレームレートからサンプリングするフレーム数を算出
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 프레임을 화상 데이터화 ⇒ 화상 데이터로부터 얼굴을 검출 ⇒ 트리밍 ⇒ html용의 화상으로서 출력
의 순서로 처리를 실시하고 있습니다.
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:
# 最大人数を超えている場合はループを抜ける
if human_cnt >= max_human:
break
# トリミング
img_trim = frame[y:(y + h), x:(x + w)]
data2 = None
data2 = human_data()
# 画像出力用フォルダを作成
if False == os.path.exists(report_path + '/img'):
os.mkdir(report_path + '/img')
# 画像出力
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
wxpython으로 GUI 만들기
GUI 부분의 소스입니다.
포인트라고 생각되는 부분의 코드에 대해 소개합니다.
동영상 해석 처리 호출 처리
동영상 해석 처리는 시간이 걸리기 때문에, 비동기로 호출하지 않으면 바쁜 상태가 되어 버립니다.
이것을 피하기 위해서, 호출 부분은 비동기로 하고 있습니다.
import threading
# 処理に時間がかかり画面がフリーズするのを防ぐためにスレッドキックする
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('指定されたフォルダにhtmlファイルを出力しました。', '処理完了')
exe화
exe화할 때는 pyinstaller를 이용했습니다.
외부 리소스를 exe에 동봉할 때는 궁리가 필요했습니다.
아래 사이트를 참고로 실시했습니다.
참조한 URL
Pyinstaller에서 리소스를 포함한 exe 만들기
명령 프롬프트에서 다음을 실행
pyinstaller --onefile --icon=icon.ico -n chuntaMovieAnalyzer view_gui.py
생성된 spec 파일을 편집하고 명령 프롬프트에서 다시 실행
pyinstaller chuntaMovieAnalyzer.spec
다운로드는 이쪽으로부터
GitLab ChuntaMovieAnalyzer
Reference
이 문제에 관하여(python wxpython + openCV로 간단한 동영상 분석 도구 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/chuntaweb/items/98353e846fcc56621471텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)