python wxpython + openCV로 간단한 동영상 분석 도구 만들기

아젠다


  • 소개
  • 완성 된 도구 데모
  • openCV에서 비디오 분석
  • wxpython으로 GUI 만들기
  • pyinstaller로 exe화

  • 소개



    동영상 중의 「어느 시간에」 「어떤 인물이 나오는지」를 알고 싶다고 생각한 적이 있고,
    공부하고 있던 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

    좋은 웹페이지 즐겨찾기