techno_memo

個人用の技術メモ。python・ROS・AI系のソフトウェア・ツールなどの情報を記載

画像・動画ファイル読み込み方法 (フォルダ配下の画像/動画/ドキュメントを一括読み込み)

やりたいこと

 ユーザーが指定したローカルフォルダにある下記ファイルを画像形式で読み込む

  • jpgファイル

  • pngファイル

  • aviファイル

  • mp4ファイル

  • pdf ファイル (各ページを画像として取得)

 フォルダ・ファイルパスを指定すると拡張子からフォーマットを識別して取得

f:id:sd08419ttic:20190220235434p:plain

 動画は全フレーム/PDFは全ページを読み込む

 読み込み結果はpandas dataframeのリスト(ファイル数分)、ファイル名のリストとして出力する

事前準備

 pdfファイルの読み込みにpdf2imageというライブラリを利用する

github.com

 上記ライブラリはpopperというアプリを動かす必要があるため、下記サイトからダウンロードして保存する

blog.alivate.com.au

 解凍後にbinファイルのパスを環境変数に指定する必要がある。  下記githubスクリプトではpythonファイル内でパスを指定する処理を入れているのでフォルダ名を変更すれば利用できる。

実装

実装結果

https://github.com/sd08419ttic/python_tech_memo

各フォーマットファイルをnumpy ndarray として読み込む

画像・動画はopencvの関数を利用する (動画はフレームを1フレームづつ読み込み、成功した場合は保持する)

pdfはPILファイルをndarrayに変換した後で、色の順序をBGRにして保存する

    def read_image_data(self,filename):
        '''
        画像データを読みとる (jpg/png/bmp)
        '''
        result = cv2.imread(filename)
        return result

    def read_movie_data(self,filename):
        '''
        動画ファイルを読み込む(avi,mp4,wmv)
        '''
        result_list = []
        try:
            cap = cv2.VideoCapture(filename)
            ret, frame = cap.read()             #最初のフレームを取得
        except:
            print(filename ,"could not loaded!")
            traceback.print_exc()
            return result_list

        indx = 0
        while (cap.isOpened()):
            ret, frame = cap.read()             #最初のフレームを取得
            if ret == True: #読み込み成功判定
                #img = cv2.cvtColor(frame, cv2.COLOR_BGR)
                result_list.append(frame)
                print("deb_movie",indx)
                indx = indx +1
            else:
                break
        cap.release()
        return result_list

    def read_pdf_page(self,filename):
        '''
        PDFファイルを画像として読み込む (ページを一括変換)
        '''
        result_list = []
        try:
            images = convert_from_path(filename)
            for indx in range(len(images)):
                img_temp = np.asarray(images[indx])
                img_temp = img_temp[:, :, ::-1].copy()    #RGB->BGR
                result_list.append(img_temp)
        except:
            print(filename, "could not loaded!")
            traceback.print_exc()
            result_list = null
        return result_list

参考サイト・書籍

haitenaipants.hatenablog.com

参考書 Pythonではじめるデータラングリング ―データの入手、準備、分析、プレゼンテーション

www.amazon.co.jp