目次
方法
- PhoneやiPadの画面収録をしながら、本をパラパラとめくっていく
- 1ページあたり0.1秒ぐらい止めながらめくる
- 早すぎるとそのページは画像として残らない
- 普通に流し読みする程度の早さなら問題ない
- 1ページあたり0.1秒ぐらい止めながらめくる
- 収録結果の動画ファイルを以下のpythonスクリプトで変換
- 入力動画ファイル名はinput_video.mp4決め打ち
import subprocess
import os
import cv2
import numpy as np
from collections import defaultdict
def extract_frames(video_path, output_folder):
if not os.path.exists(output_folder):
os.makedirs(output_folder)
command = f'ffmpeg -i "{video_path}" "{output_folder}/frame_%05d.png"'
subprocess.call(command, shell=True)
def compare_frames(frame1, frame2):
diff = cv2.absdiff(frame1, frame2)
return np.sum(diff)
def hash_frame(frame):
# フレームをグレースケールに変換
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# サイズを縮小
resized = cv2.resize(gray, (8, 8), interpolation=cv2.INTER_AREA)
# 平均値を計算
avg = resized.mean()
# 2値化
diff = resized > avg
# ハッシュ値を計算
return sum([2**i for (i, v) in enumerate(diff.flatten()) if v])
def remove_similar_and_duplicate_frames(folder_path, threshold=2, similarity_threshold=100):
files = sorted([f for f in os.listdir(folder_path) if f.endswith('.png')])
prev_frame = None
static_count = 0
frames_to_keep = []
frame_hashes = defaultdict(list)
for file in files:
current_frame = cv2.imread(os.path.join(folder_path, file))
frame_hash = hash_frame(current_frame)
if prev_frame is not None:
diff = compare_frames(prev_frame, current_frame)
if diff < similarity_threshold:
static_count += 1
else:
static_count = 0
if static_count >= threshold:
frame_hashes[frame_hash].append(file)
else:
frame_hashes[frame_hash].append(file)
prev_frame = current_frame
# 同じハッシュを持つフレームのうち、最初のものだけを保持
for hash_value, file_list in frame_hashes.items():
frames_to_keep.append(file_list[0])
# 不要なフレームを削除
for file in files:
if file not in frames_to_keep:
os.remove(os.path.join(folder_path, file))
def main():
video_path = 'input_video.mp4' # 入力動画のパス
output_folder = 'output_frames' # 出力フォルダ
extract_frames(video_path, output_folder)
remove_similar_and_duplicate_frames(output_folder)
if __name__ == "__main__":
main()
詳しい説明
pythonスクリプトでやっていること
- ffmpegで動画をフレームごとにpngファイルに分割保存
- pngファイルの内容を前後フレームで比較し、1フレームで内容が変わっているpngファイルは消去
- 2フレーム以上同じ内容が続くpngファイルだけ残るので、同じ内容のものは一つだけ残してあとは消去
合法性について
- 作った画像を自分自身や家族だけが使う場合、著作権法上の私的利用にあたるため、問題ない
- いきなり警察に捕まることは無いだろう
- Kindleの利用規約としては問題がある可能性が高い
- が、画像化して自分だけで使ったところで、Amazon社からそれを知る手段がないため、現実的にはなにも起こらないだろう
コメント