동영상 편집의 일이 늘어나고 있기 때문에, 찍은 동영상의 내용을 간단하게 파악하고 싶어서, 몇개의 장면을 픽업한 화상을 간단하게 생성할 수 없는가 생각해 보았다

9520 단어 파이썬OpenCV

소개



취미가 높아 동영상 촬영이나 편집의 일이 늘어나는 가운데, 30만엔 가까이 내고 4K카메라를 구입해 여러가지 촬영을 하는 나날이 계속되고 있는 오늘 요즘.
촬영한 동영상이 너무 많아서 곤란하고 있었기 때문에, 타이틀에 있는 대로 동영상을 하나하나 보지 않아도 썸네일로 내용을 파악할 수 있는 화상이 필요해져, 그런 화상을 생성하는 스크립트를 만들어 보았으므로 메모 합니다.

실행 환경


  • Python 3.x
  • OpenCV

  • 사전 준비



    다음과 같은 폴더 구성으로 합니다.
    ┬ make_img.py
    ├ mp4
    │ ├ 動画1.mp4
    │ └ 動画2.mp4
    └ img
    

    mp4라는 폴더에 동영상 데이터를 넣고 img라는 빈 폴더를 만듭니다.

    스크립트 만들기



    make_img.py
    from glob import glob
    import cv2
    import os
    import random
    
    def make_thumb(filename):
    
        # 対象ファイルの取得
        cap = cv2.VideoCapture(filename)
    
        # 総フレーム数の取得
        frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
    
        # サムネイルの行列数
        row = 4
        col = 4
        num = row * col
    
        cnt = 0
    
        for r in range(row):
    
            for c in range(col):
    
                # フレーム番号の取得
                if cnt == 0:
                    j = int(0.5 * frames / num)
                else:
                    j = int(frames / num) * (cnt)
    
                # フレームの移動とキャプチャ
                cap.set(cv2.CAP_PROP_POS_FRAMES, j) 
                ret, frame = cap.read()
    
                # 画像リサイズ
                h = int(frame.shape[1] / col)
                w = int(frame.shape[0] / col)
                frame = cv2.resize(frame, (h, w))
    
                # 取得したフレームを横に結合
                if c == 0:
                    im = frame
                else:
                    im = cv2.hconcat([im, frame])
    
                cnt += 1
    
            # 横に結合した画像を縦に結合
            if r == 0:
                img = im
            else:
                img = cv2.vconcat([img, im])
    
        cap.release()
    
        return img
    
    def main(bgn=0):
    
        # ファイル一覧の取得
        files = glob("./mp4/*.mp4")
        files.sort()
        print("ファイル数 :", len(files))
    
        i = bgn
    
        for filename in files[bgn:]:
    
            print("\r{:05} {}".format(i, filename), end="")
            img = make_thumb(filename)
    
            # 画像の保存
            f = "./img/" + filename.split("/")[-1].replace("mp4", "jpg")
            cv2.imwrite(f, img)
    
            i += 1
    
        print()
    
    if __name__ == "__main__":
        main()
    

    스크립트 실행



    다음 명령으로 실행합니다.
    $ python make_img.py
    

    실행하면 다음과 같은 이미지가 img 폴더에 저장됩니다.

    할 수 있었다!

    좋은 웹페이지 즐겨찾기