【python-openCV】画像をパネル分割⇒回転gif動画を作成!part2

前回の記事では、python&openCVを使ってこんなgif動画を作成してみました。

 

今回はこれをもう少し応用させて以下の動画を作成してみましょう。

 

それでは早速やっていきましょう。

とはいえ、基本的には前回の記事とやることは同じなので、まずは以下の記事から読んでいただけると嬉しいです。

 

スポンサーリンク

必要なライブラリ

以降のプログラムの中では以下のライブラリを使用していきます。

一緒にやってみたい方はダウンロードしておきましょう。

〇openCV

〇numpy

〇Image (from Pillow)

〇glob

〇os

 

スポンサーリンク

処理前画像の紹介

今回も私のブログではおなじみの以下の画像をつかって処理を実行していきます。

(pythonプログラムの保存場所と同じフォルダにmouse.jpgとして保存しています。)

回転動画を作成するためのサンプル画像

この画像は白黒画像ですが、以降のプログラムはカラー画像であっても動作するように作成しています。

あなたも適当な画像を準備しておきましょう。

 

スポンサーリンク

回転動画の作成プログラム

さっそくですが、以下が冒頭に紹介したgif動画を作成するpythonプログラムです。

#ライブラリインポート
import cv2
from PIL import Image
import numpy as np
import glob
import os

#画像の読み込み
pic=cv2.imread('mouse.jpg',cv2.IMREAD_COLOR)
h,w=pic.shape[:2]

#回転画像作成用の配列作成
pic_list=[]
for i in range(3):
    for j in range(3):
        pic1=pic[int(i*h/3):int((i+1)*h/3),int(j*w/3):int((j+1)*w/3)]
        pic1=cv2.resize(pic1,(int(w/3),int(h/3)))
        pic_list.append(pic1)
pic_list=np.array(pic_list)
#配列の並べ替え
pic_list =pic_list[[0, 1, 2, 5, 8, 7 ,6 ,3, 4]]

#回転画像を作成
pictures=[]
for i in range(8):
    base_array=np.zeros((h,w,3),np.uint8)
    base_array[0:int(1*h/3),0:int(1*w/3)]=pic_list[i%8]
    base_array[0:int(1*h/3),int(1*w/3)+1:int(2*w/3)]=pic_list[(i+1)%8]
    base_array[0:int(1*h/3),int(2*w/3)+1:int(3*w/3)]=pic_list[(i+2)%8]
    base_array[int(1*h/3)+1:int(2*h/3),int(2*w/3)+1:int(3*w/3)]=pic_list[(i+3)%8]
    base_array[int(2*h/3)+1:int(3*h/3),int(2*w/3)+1:int(3*w/3)]=pic_list[(i+4)%8]
    base_array[int(2*h/3)+1:int(3*h/3),int(1*w/3)+1:int(2*w/3)]=pic_list[(i+5)%8]
    base_array[int(2*h/3)+1:int(3*h/3),0:int(1*w/3)]=pic_list[(i+6)%8]
    base_array[int(1*h/3)+1:int(2*h/3),0:int(1*w/3)]=pic_list[(i+7)%8]
    base_array[int(1*h/3)+1:int(2*h/3),int(1*w/3)+1:int(2*w/3)]=pic_center
    cv2.imwrite('out'+str(i)+'.jpg',base_array)
    img = Image.open('out'+str(i)+'.jpg')
    pictures.append(img)

#gif動画を作成
pictures[0].save('anime3.gif',save_all=True, append_images=pictures[1:], 
                 optimize=True, duration=300, loop=0)

#途中で作ったファイルを削除する
list = glob.glob('out*')
for file in list:
    os.remove(file)

こりゃ長い・・・。

 

※もし上記のプログラムでエラーが出た際はPillowのバージョンの影響だと思われますので、以下の記事の後半部分を参考にしてみてください。

【python】複数画像からパラパラ漫画(gifアニメ)を作成する方法!

 

スポンサーリンク

サンプルコードの解説

基本的にやっていることは前回と同じですので、今回は簡単に解説していきます。

 

やっていることは、読み込んだ画像を以下の要領で9つの領域に分割し、

回転動画を作成するための処理内容の確認

真ん中を除く8つの領域を回転させながら8つの画像を作成します。

以下がそれらの画像です。

回転動画を作成するための処理内容の確認

 

これらの画像をPillowのImageライブラリをつかってgif動画に変換しています。

gif動画への変換作業を詳しく知りたい方は以下の記事をご参考ください。

【python】複数画像からパラパラ漫画(gifアニメ)を作成する方法!

 

応用すればめちゃくちゃ高回転で回すこともできます。

(はやすぎて閲覧環境によっては動かないかもしれません。)

 

スポンサーリンク

おわりに

というわけで今回はpython-openCVを使って、既存の画像を9つに分割⇒周囲の8つのパネルを回転させた動画を作成する方法をご紹介しました。

 

ただのお遊びではありますが、様々なスキルが必要な作業です。

ぜひあなたも勉強がてらにやってみてはいかがでしょうか。

 

このように、私のブログでは様々なプログラミングスキルを紹介しています。

今は仕事中で時間がないかもしれませんが、ぜひ通勤時間中などに他の記事も読んでいただけると嬉しいです。
⇒興味をもった方は【ヒガサラ】で検索してみてください。

確実にスキルアップできるはずです。

 

最後に、この記事が役に立ったという方は、ぜひ応援よろしくお願いします。
↓ 応援ボタン
にほんブログ村 IT技術ブログへ
にほんブログ村

それではまた!

コメント

タイトルとURLをコピーしました