潔く銀のメモ的備忘録

ガジェットとプログラムとか私的なメモを残してます。

PythonとOpenCVを用いて複数の静止画から動画に変換する

こんにちは、潔く銀です。

 

前回は、動画から静止画にするプログラムを作りました。今回は、その逆である静止画から動画にするプログラムを作成しました。こちらは、需要があるかわかりませんが作ってみたので良かったら見てください。

今回のコードは、天体写真のタイムラプス動画を作成するために自作しました。自分で作成した方が使いやすいですからね(笑)

ソースコードはコピペしてもらえると使えるようになります。使う際は、ファイルパスなどは確認してください。

  

動作環境

 

ソースコード

import cv2
import glob
import os
import shutil
import time

"""
parameta
"""
frame_size = -1  #FHD=0, 4K=1
frame_rate = 30.0  #FPS

"""
end
"""

""" size set"""
if frame_size == 0:
    #FHD Timelaps動画用
    width = 1920
    height = 1080
elif frame_size ==1:
    #4K Timelasp動画用
    width = 3840
    height = 2160
else:
    #小さめに作る
    width = 640
    height = 360

""" """


def timelaps(images):
    
    
    fourcc = cv2.VideoWriter_fourcc('m','p','4','v')
    video = cv2.VideoWriter('timelaps.mp4', fourcc, frame_rate, (width, height))
    
    
    print("動画変換中...")
    
    for i in range(len(images)):
        img = cv2.imread(images[i])
        img = cv2.resize(img,(width,height))
        video.write(img) 
        
    
    video.release()
    print("動画変換完了")
    




if __name__ == '__main__':
    
    start = time.time()
    
    images = sorted(glob.glob('images/*.jpg'))
    print("画像の総枚数{0}".format(len(images)))
    timelaps(images)

    elapsed_time = time.time() - start
    print ("処理にかかった時間は:{0}".format(elapsed_time) + "[sec]")

 

動画サイズは、パラメータを触ってもらうといくらでも変更可能です。
今回のプログラムは、天体撮影を行った際に撮れた連続写真を動画に変換するために作成したコードになりますので、FHDや4Kのサイズ設定を最初に用意しています。使用用途はそれくらいしかないのかなと少し思います・・・

 

使用環境によっては、sorted関数が作用せずに順番通りに読み込まれない場合があります。その際は、natsortedを使用するば順番通りに読み込まれると思います。

 

 

天体撮影かつプログラミングしている方は遊んでみてください(^^)

OpenCVを用いて動画を切り出す(ソースコードあり)

 

こんにちは、潔く銀です。

大学生や大学院生の研究などで、動画を静止画にしたい方は多いと思います。調べて作るのは面倒だと思うので、今回はPythonを使用して動画を静止画に切り分けるコードを書きました。動画を切り出したい方はコピペするだけ動作します。

 

 

動作環境

 

 

 

ソースコード

 

import numpy as np
import cv2
import os
import shutil


image_dir='image_dir/' #出力先のフォルダ
image_file='img_%s.jpg'
movie_file='***.mp4'

i=0
count = 0
cpf = 30 #cut par frame

#ファイルが存在してるか確認
if os.path.exists(image_dir):
    shutil.rmtree(image_dir)

#ファイルが存在してなかったら作る
if not os.path.exists(image_dir):
    os.makedirs(image_dir)

cap = cv2.VideoCapture(movie_file)

while(cap.isOpened()):
    ret, frame = cap.read()


    if ret == False:
        break

    if count%cpf == 0:

        cv2.imwrite(image_dir+image_file % str(i).zfill(6), frame)  # Save a frame
        print('Save', image_dir+image_file % str(i).zfill(6))
        i += 1

    count = count + 1



cap.release()

 

cpfは、何フレームごとに画像を切り出すかの値になります。載せているソースコードの場合は、「30フレームに1回静止画を保存する」ことになります。
30fpsで撮影することができるカメラで記録した動画をこのコードで切り分けると、1秒に1回保存することが出来ます。

全てのフレームを切り出す時は、cpf=1で実現できます。ただ、膨大なフレーム量になるので動画より容量が大きくなるので、cpfの値は使用用途によって変えることをオススメします。

python3でwebカメラを使うテンプレート

 

こんにちは、潔く銀です。

 

 

今回は、pythonを用いてのウェブカメラから画像を取得するというコードのテンプレートをここに載せておきたいと思います。

新しくコードを書くときなど、過去のコードを探してテンプレート引っ張ってくるのが面倒なので、ここに書いておけばコピペで使えるという理由で載せておきます。

 

作成した環境を一応参考までに載せておきます。

 

作成環境

 

ソースコード

import cv2

##############  Camera capture ################################
cap = cv2.VideoCapture(0)
cols = 1920
rows = 1080
framerate = 30



cap.set(cv2.CAP_PROP_FPS, framerate)      #カメラFPSを60FPSに設定
cap.set(cv2.CAP_PROP_FRAME_WIDTH, cols)   #カメラ画像の横幅を1920設定
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, rows)  #カメラ画像の縦幅を1080に設定


print (cap.get(cv2.CAP_PROP_FPS))
print (cap.get(cv2.CAP_PROP_FRAME_WIDTH))
print (cap.get(cv2.CAP_PROP_FRAME_HEIGHT))


while(True):
    # Capture frame-by-frame
    ret, frame = cap.read()


    cv2.namedWindow("frame", cv2.WINDOW_KEEPRATIO | cv2.WINDOW_NORMAL)
    cv2.imshow('frame',frame)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break


    cv2.imshow("result", frame)



# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()

 

Webカメラが認識しない場合は、cv2.VideoCaptureのデバイスidが違うので1とかに変更しないといけない可能性があります。

cols, rowsでフレームの大きさを決めることができるので、使用したい解像度をこのパラメータを調整することで決めることができます。

 

もう少し簡素化したコードは以下になります。

 

import cv2

def capture_camera():
    """Capture video from camera"""
    # カメラをキャプチャする
    cap = cv2.VideoCapture(0) # 0はカメラのデバイス番号

    while True:
        # retは画像を取得成功フラグ
        ret, frame = cap.read()

        # フレームを表示する
        cv2.imshow('camera capture', frame)

        k = cv2.waitKey(1) # 1msec待つ
        if k == 27: # ESCキーで終了
            break

    # キャプチャを解放する
    cap.release()
    cv2.destroyAllWindows()

if __name__ == '__main__':
    capture_camera()

 

一応、僕が画像処理をし始めた時に作成したコードになりますので、他人が見ると微妙かもしれませんが、とりあえず動作させたいという時は役に立つのでメモ程度に残しておきます。