乙Py先生のプログラミング教室
初学者のためのプログラミング学習サイト

クロちゃん

今回は乃木坂時々クロちゃんということで
TikTokの動画っぽいアレを作ってみることとしました。

解説動画はこちら





さて
今回はTikTok動画のアレみたいなやつを
作ってみようと思います。

アレとは 人の顔から次の人の顔に移り変わるやつの事で 一般的にはFaceMorphingと言うらしい?!です。

それを可能にするコードが
githubに有りましたので
それを参考にさせていただきます。

参考:face-morphing

このコード類を利用するには
少し沢山のインストールが必要で
特にopencvやdlibなどが必要です。

動かしたい方はgithubのRequirementsを
うまく満たすようにライブラリ群を揃えて下さい。

それではコードの方を見てみましょう。
JupyterNotebookで動かせるように
githubからファイルをダウンロードして
Notebookのディレクトリに配下に置きました。

まずはライブラリ群のインポートから
from morphing.face_landmark_detection import makeCorrespondence
from morphing.delaunay import makeDelaunay
from morphing.faceMorph import makeMorphs
import subprocess
import argparse
import shutil
import os

def doMorphing(thePredictor,theImage1,theImage2,theDuration,theFrameRate,theResult):
        [size,img1,img2,list1,list2,list3]=makeCorrespondence(thePredictor,theImage1,theImage2)
        if(size[0]==0):
                print("Sorry, but I couldn't find a face in the image "+size[1])
                return
        list4=makeDelaunay(size[1],size[0],list3)
        makeMorphs(theDuration,theFrameRate,img1,img2,list1,list2,list4,size,theResult)
これがうまく実行できていたら
動くだろうと思います。

実行部分はこれです。
# ランドマークファイルの場所
dat_path = 'shape_predictor_68_face_landmarks.datファイルのパス'
# 画像の指定
img1 = '画像のパス'
img2 = '画像のパス'
# 1秒あたりの画像枚数 dur = 5 # 動画の枚数 fr = 25 res = 'mp4ファイルの出力パス' doMorphing(dat_path,img1,img2,dur,fr,res)
2枚の画像と出力先を指定します。
1秒あたりの枚数と、全体の枚数も指定します。
多くすればよりスムーズになると思います。

出来上がりの確認は・・・
JupyterNotebook上では
%%HTML
を使うとHTMLを使用することができます。

%%HTML <video width="動画サイズ" height="
動画サイズ"> <source src="xxx.mp4" type="mp4のパス"> </video>

さて出来上がりを見てみましょう。
githubに有ったサンプル画像だとこうなります。

Videotogif (2)

こいつの仕組みとしては
画像と画像の中間画像を作っていって
それを動画化しているようです。

中間画像はこんな感じです。
bentyuukan

なかなか面白いですよね!!!


次に乃木坂46さんでやってみました。

Videotogif

いやー
ほんと素晴らしいですね!!!!!


クロちゃんも混ぜてみたくなったので
混ぜるとこうなります。
Videotogif (1)

うーーん
パンパンですね!!!!!


お口直しに
現在の乃木坂46全員分で
FaceMorphingしてますんで
見てやって下さい。

それでは。

お盆でも暇なので
色々な歴史上の人物を
全部クロちゃんに変えてみました。

解説動画はこちら


 
色々試してみました。

・幕末の人
・絵
・外人
・大統領

全部行けちゃいましたねーー

さっすがクロちゃん
めちゃくちゃ素材として優秀です。

何に合成しても
違和感なし!!

出来上がったやつを
1つ2つ載せておきますで。

リョーマ
download-12


ペリ井さん
download-5


ザビ
download-6


大統領とかのやつは
色々怒られそうな感じしますよね(笑)ー

他にも色々ありますんで
残りは動画の方を
見ていただければと思います。

それでは!!

今回は3D写真を作る奴を試してみました。

説明動画はこちら





元ネタはGIGAZINEさんに紹介されていた
画像から簡単に精巧な3D写真が作成できる論文が公開される 実際に3D写真を生成することも可能

という記事の内容です。

1枚の写真から
立体感のある3D写真を生成するというものです。


早速試してみましょう。

手順は
1.下記のGoogle Colaboratoryノートブックにアクセス
要Google Acount

GoogleColabのサンプル

2.「ファイル」から「ドライブにコピーを保存…」をクリック
スクリーンショット 2020-04-18 16.29.07



3.Prepare environmentの再生ボタンをクリック
ツール類のインストールをしている模様(5分くらいかかる)
スクリーンショット 2020-04-18 16.29.48




4.Download script and pretrained model」下の再生ボタンをクリック
gitからコードを読み込んでダウンロードshellを実行している模様
スクリーンショット 2020-04-18 16.30.01



5.Switch off off-screen renderingの再生ボタンをクリック
argument.ymlを書き換えてるっぽい
スクリーンショット 2020-04-18 16.30.12



6.Please upload .jpg files の再生ボタンをクリック
デスクトップとかに画像を用意しておいて、変換したい画像を選択する。
この部分を実行すると選択ボタンが下の方に出るので
スクリーンショット 2020-04-18 16.30.38

ファイル選択をクリックして自分の変換したいファイルを選択する
スクリーンショット 2020-04-18 16.30.50

アップロードすると「image」フォルダの中に格納される。


7.Execute the 3D Photo Inpainting」の再生ボタンをクリック
画像から動画ファイル(MP4)が作成される。(結構時間かかる)
スクリーンショット 2020-04-18 16.31.02


8.「3d-photo-inpainting」の中の「video」フォルダ内に
出力された3D写真がMP4形式で保存されている
スクリーンショット 2020-04-18 16.31.25

ファイルは
「xxx_circle.mp4」: 螺旋を描いて拡大縮小
「xxx_swing.mp4」: 横にスライドしながら拡大縮小
「xxx_zoom-in.mp4」: ズームインのみ
の3種類が作成される。


サンプルには
こんな画像がついています。
スクリーンショット 2020-04-18 16.23.12

ここに動画は載せられないようなので
代わりにGIFにしたものを置いておきます。
moon_swing.mp4
download

こんな感じで
奥行きを感じられる風に動きます。

コードでは
自分で画像ファイルをアップして
3D写真に変換することもできるので

興味のあるかたは
是非試してみてください。

それでは。





はいどうも
乙pyです。

今回はみんな大好き黒川先輩を
世界旅行に連れて行ってあげましょう
という企画です。

動画はこちら




さて今回は
OpenCVというのを使います。

OpenCVは画像加工のための
ライブラリでPython以外の言語にも
対応しているものです。

これを用いると
画像を使っていろいろ遊ぶことができます。

インストール方法は
pip install opencv-python

でインストールすることができます。

Pythonでの使い方:

まずはじめにライブラリを読み込みます。
import cv2
import numpy as np 
import matplotlib.pyplot as plt
%matplotlib inline

これでライブラリを使う準備は完了です。

画像をうまく合成するには
1.背景画像
2.上に載せる画像
3.載せる画像のマスク画像

この3つが必要になります。

背景は良いとして
マスク画像というのは
kurochan6

こんな感じで、載せたい部分を白
それ以外の部分を黒く塗りつぶした画像を
マスク画像として使えます。

マスク画像なしでも
画像を合成することはできますが
スムーズな合成をするには
マスク画像が必要です。

コードはこんな感じになります。

file_dir = 'img/'
kurochan = 'kurochan.jpg'
bg_name = 'roma.jpg'
msk_name = 'kurochan6.png'
src = cv2.imread(file_dir + kurochan)
dst = cv2.imread(file_dir + bg_name)
msk = cv2.imread(file_dir + msk_name)

size_rate = 0.8
src2 = cv2.resize(src , (int(src.shape[1]*size_rate), int(src.shape[0]*size_rate)))

r_msk = cv2.resize(msk , (int(msk.shape[0]*size_rate), int(msk.shape[1]*size_rate)))

output = cv2.seamlessClone(src2, dst, r_msk, 
(src2.shape[0]//2,dst.shape[0]-src2.shape[0]//2), cv2.NORMAL_CLONE)

fig = plt.figure(figsize=(16,9))
plt.imshow(cv2.cvtColor(output, cv2.COLOR_BGR2RGB))
plt.show()

合成する画像をsrc
背景をdst
マスク画像をmsk
として読み込み
outputを生成しています。

cv2.seamlessCloneメソッドで
合成ができます。


さて合成してみると
こんな感じになります。

96

マスクの白い部分だけが合成に用いられ
黒い部分は背景とうまく合うように演算処理され
画像が合成される仕組みになっているようです。

cv2.seamlessCloneメソッドで
配置も決めるので
画像の大きさを超えるような場所に指定すると
エラーになります。

雑な合成ですが
元の画像とマスクの調整をうまくやれば
それっぽい画像ができるのではないかと思います。

これを用いると
まるで旅行に行ってきたような
画像を作ることができたりするので

アリバイ作りなんかも
できちゃったりするかもしれませんねwww


OpenCVは
他にもいろーーんなことができるので
また試していきたいと思います。

今回はここまでです。

それでは。


このページのトップヘ