Pythonでいろいろやってみる

Pythonを使った画像処理や機械学習などの簡単なプログラムを載せています。

動画からサムネイルを作る

 動画から指定のフレームを切り出し文字を入れてサムネイルを作ります。動画ファイルを読み出しキャプチャーした画像の明度と彩度を強調し派手にしたうえで、縁取りの大きな文字で動画タイトルを入れます。画像のサイズをYoutube推奨カスタムサムネイルサイズの1280,x720にリサイズしてjpegで保存します。動画ファイルの読み出し、指定した秒数のフレームのキャプチャー、明度と彩度の強調は画像処理ライブラリOpenCVで行い、タイトル文字の描画とリサイズを画像処理ライブラリPillowで行います(OpenCVでは日本語を描画できないため)。

環境
  • windows10 home
  • Anaconda 3/ jupyter notebook 5.6.0
  • Python 3.8.8
  • Pillow 8.2.0
  • OpenCV 4.0.1
準備

 動画ファイルはMixkitの "Young people dancing intensely"をダウンロードし320x180にリサイズしたうえでjupyter notebookファイル(***.ipynb)と同じディレクトリにファイル名’dancing.mp4'で保存しました(フレームサイズ:1920x1080、 動画の長さ:18秒、フレームレート25:フレーム/秒) 。

コード

10秒15フレームを指定してサムネイルを作ります。

import cv2
from PIL import Image, ImageDraw, ImageFont
import numpy as np

# 動画ファイルのキャプチャー
cap = cv2.VideoCapture('dancing.mp4')

# 動画ファイルのフレームレート取得
fps = cap.get(cv2.CAP_PROP_FPS)

# サムネイルにする秒、フレーム数指定(10秒15フレーム)
target_sec = 14
target_frame = 12
target = (target_sec + target_frame/fps)*1000

# 設定した時間に移動
cap.set(cv2.CAP_PROP_POS_MSEC, target)

# 画像のキャプチャー
ret, frame = cap.read()

# 再生画像をクローズ
cap.release() 

# 変換用ルックアップテーブルの生成
gamma = 1.5
look_up_table = np.zeros((256, 1) ,dtype=np.uint8)
for i in range(256):
    look_up_table[i][0] = (i/255)**(1.0/gamma)*255

# 色空間をBGR->HSVに変換
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)         

# チャンネルごとに分割
h, s, v = cv2.split(hsv)  

# 明度(V)に対してルックアップテーブル適用
v_lut = cv2.LUT(v, look_up_table)       
        
# 彩度(S)に対してルックアップテーブル適用
s_lut = cv2.LUT(s, look_up_table)  
        
#  H,変換後S,変換後Vをマージ
merge = cv2.merge([h, s_lut, v_lut])  
        
# HSV->BGR変換
bgr = cv2.cvtColor(merge, cv2.COLOR_HSV2BGR) 

# Pillow画像ファイルに変換
im = Image.fromarray(cv2.cvtColor(bgr, cv2.COLOR_BGR2RGB))

# 縁取り文字の描画
draw = ImageDraw.Draw(im)
font = ImageFont.truetype('C:\Windows\Fonts\BIZ-UDGothicB.ttc', 220)
draw.text((800, 30), '話題の〇〇', fill=(250, 220, 0), font=font, 
          stroke_width=12, stroke_fill=(0, 0, 0))

font = ImageFont.truetype('C:\Windows\Fonts\BIZ-UDGothicB.ttc', 210)
draw.text((20, 830), 'みんなで踊ってみた', fill=(255, 0, 255), font=font, 
          stroke_width=12, stroke_fill=(0, 120, 0))

# リサイズ
resize = im.resize((1280, 720))

# 画像の保存
resize.save('thumbnail.jpg')

実行結果

10秒15フレームの画像に対して彩度明度を強調しタイトル文字を入れたサムネイル画像が1280,x720のjpegファイルで保存されます。
f:id:T_A_T:20220129111451j:plain

以下のサイトを参考にさせていただきました

PythonとRPAで遊ぶ > Python OpenCV - 動画のサムネイルを作る
Pythonの文法メモ > 【OpenCV】動画ファイルの読み出しとプロパティ取得、キャプチャー画像の保存
Pythonの文法メモ > 【Pillow】ImageDraw.textによる文字の描画

ブログランキングに参加しています

にほんブログ村 IT技術ブログへ
にほんブログ村