物理の駅 Physics station by 現役研究者

テクノロジーは共有されてこそ栄える

Pythonで動画ファイル (形式.mp4)から画像を切り出す

note.nkmk.me

OpenCVを使うとすぐに実装できる。ほぼ上記URLのサンプル通り。

import cv2
import os

def save_all_frames(video_path, ext='jpg'):
    if not os.path.exists(video_path):
        return

    cap = cv2.VideoCapture(video_path)

    if not cap.isOpened():
        return

    dir_path = os.path.dirname(video_path)
    digit = len(str(int(cap.get(cv2.CAP_PROP_FRAME_COUNT))))

    n = 0

    while True:
        ret, frame = cap.read()
        if ret:
            filename = '{}_{}.{}'.format(os.path.splitext(os.path.basename(video_path))[0], str(n).zfill(digit), ext)
            cv2.imwrite(os.path.join(dir_path,filename), frame)
            n += 1
        else:
            return

save_all_frames(r"C:\Users\Masahiro\Downloads\file.mp4")
save_all_frames(r"C:\Users\Masahiro\Downloads\file.mp4","png")

Python+matplotlibで2次元ヒストグラムをモルワイデ図法で描画する方法

stackoverflow.com

を参考にした。

2Dヒストグラムのbinデータを自力で用意し、pcolormesh で描画する。その方法は

pythonのmatplotlibで2次元ヒストグラム(hist2d)のビンの値を直接操作する - 物理の駅 Physics station by 現役研究者

で解説している。

モルワイデ図法にするコードは plt.subplot(111, projection="mollweide")

import matplotlib.pyplot as plt
import numpy as np


def f(x, y, constant, mu_x, mu_y, sigma_x, sigma_y):
    return np.exp(-((x-mu_x) ** 2) / (2 * sigma_x ** 2)) * np.exp(-((y-mu_y) ** 2) / (2 * sigma_y ** 2)) * constant


plt.figure()
plt.subplot(111, projection="mollweide")

lon = np.linspace(-np.pi, np.pi, 360)
lat = np.linspace(-np.pi/2., np.pi/2., 180)
Lon, Lat = np.meshgrid(lon, lat)
arr = f(Lon, Lat, 1, 0, 0, 0.6, 0.2)
arr += f(Lon, Lat, 0.5, 1.5, 0, 0.2, 0.2)

plt.pcolormesh(Lon, Lat, arr, cmap='Reds', shading='auto')
plt.grid(True)

plt.savefig("projection_mollweide.pdf")
plt.show()

Pythonでモルワイデ図法で描いた図