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

opencv

さて久々の画像加工の回です

opencvを用いると簡単に画像の加工ができます。



解説動画はこちら




はいそれではまず最初に
opencvを使うにはライブラリを読み込みましょう。

インストールしていない方は
pip などでインストールしてみてください。

まず最初に画像を加工する関数を作ります。

アニメ画像みたいな加工をする関数を作ります。
def anime_filter(img, K= 20):
    gray = cv2.cvtColor(img, cv2.COLOR_BGRA2GRAY)
    edge = cv2.blur(gray, (13, 13))
    edge = cv2.Canny(edge, 10, 40, apertureSize=3) 
    edge = cv2.cvtColor(edge, cv2.COLOR_GRAY2BGR)
    img = np.array(img/K, dtype=np.uint8)
    img = np.array(img*K, dtype=np.uint8)
    return cv2.subtract(img, edge)
これで画像をアニメ風にします。

やっていることはエッジの抽出とぼかしです

次にモザイク処理する関数を作ります。

def mosaic(src,ratio=0.07):
    img = src.copy()
    x, y, w, h = 0, src.shape[0]//3,src.shape[1],src.shape[0]//3
    tmp = img[y:y + h, x:x + w]
    small = cv2.resize(tmp, None, fx=ratio, fy=ratio, interpolation=cv2.INTER_NEAREST)
    img[y:y + h, x:x + w] = cv2.resize(small, tmp.shape[:2][::-1], interpolation=cv2.INTER_NEAREST)
    return img

モザイクはopencvのresize機能で実現できます。
この関数で画像の一部分にだけ
モザイク処理をすることができます。

はい
それでは実際に画像に処理してみましょう。

画像は4枚使用しますが
画像はご自身で用意して下さいね。

img1_path = 'smap/sawaziri.png'
img2_path = 'smap/makky.png'
img3_path = 'smap/ASKA.png'
img4_path = 'smap/pierre.png'
paths = [img1_path,img2_path,img3_path,img4_path]

fig = plt.figure(figsize=(20,16))

for i,(path,A) in enumerate(zip(paths,['S','M','A','P'])):
    ax = fig.add_subplot(1, 4, i+1)
    img = cv2.imread(path)
    anime = anime_filter(img)
    mos = mosaic(anime)
    cv2.putText(mos, A, (mos.shape[1]//2, mos.shape[0]//4), 
                cv2.FONT_HERSHEY_PLAIN, 4, (255, 255, 255), 5, cv2.LINE_AA)
    ax.imshow(cv2.cvtColor(mos, cv2.COLOR_BGR2RGB))
    ax.set_xticks([])
    ax.set_yticks([])
plt.show()

実行した結果は
・・・・・


download


はいこのようになりました。
アニメっぽくして
モザイクをかけて
文字を追加しております!!!!

S
M
A
P
で始まる方々を
画像加工してみました。

はい
ということで
opencvを用いると
簡単に画像加工をすることができるので
皆さんも試してみて下さいね

今回はここまでです
それでは


先日のアメトーク5時間スペシャルで

安倍総理のモノマネをしている

サンドイッチマン伊達さんが

非常に面白かったので

ディープフェイクで顔を入れ替えてみました。

解説動画はこちら


やっていることは
画像の顔部分に
別の人の顔の画像を貼り付けているだけです。

opencvを用いて顔を判別し
いい感じに顔を切り抜いて
もう一方の画像に
いい感じに貼り付けることで
実現できます。

さて
結果どうなるかと言うと

メガネが邪魔!!!!

今の技術では
メガネをうまく消すことができませんねーーー

download-4
download-3
download-2
download-1
download

メガネをしていない画像は
うまく行きますね!!!

伊達さんの輪郭に
安倍総理の顔でも
そこまで違和感はないですねーー

と言う意見は
トランプ大統領と
一致するのかしないのか

トランプ大統領に
聞いてみたいものです。

ディープフェイクですので
こちらは偽物の静止画ですが

動画があれば動画でもやってみたいですねー

皆様もぜひ試してみてください

それでは。

どうやら
大河ドラマの代役がキマったようですね!!!

キマった言うても
代役の方ですよーーー

代役は
川口春奈さん

と言うことで
沢尻エリカさんと川口春奈さんの写真を用いて
濃姫役を川口春奈さんがやった場合の
イメージがどうなるかを検証してみましょう!!


解説動画はこちら





まず画像の加工などは
opencvを用いて行なっています。

opencvを用いて
画像を油絵ぽくすることが出来ます。

ソースはこれ

import cv2
import numpy as np

img1 = cv2.imread('ファイルパス')

oil_filter = np.array([[-1,-1,-1,-1,-1,-1,-1],[-1, 0, 0, 0, 0, 0,-1],[-1, 0, 0, 0, 0, 0,-1],[-1, 0, 0,26, 0, 0,-1],
                       [-1, 0, 0, 0, 0, 0,-1],[-1, 0, 0, 0, 0, 0,-1],[-1,-1,-1,-1,-1,-1,-1]], np.float32) / 2.0

oilpaint = cv2.filter2D(cv2.medianBlur(img, 39), -13, oil_filter)

plt.figure(figsize=(16,10))
plt.imshow(cv2.cvtColor(oilpaint, cv2.COLOR_BGR2RGB))
plt.tick_params(labelbottom=False,labelleft=False,labelright=False,labeltop=False)
plt.tick_params(bottom=False,left=False,right=False,top=False)
plt.show()

もし画像をお持ちでしたら
試しにやってみてください。

写真を油絵っぽくするには
まずブラーをかけています。

ブラーは「ぼかし」ですね。

次にフィルターをかけています。
フィルターは行列の数値の計算をしている感じです。
numpyを用いていますので
数値を変えることで色々な加工が出来ます。

あとは
顔を入れ替えるのは
前回の動画でもやっている
フェイススワッピングアプリで
行なっています。

出来上がりの結果は・・・
download

こわっっ!!!!!

どうやら
春菜違いで
合成に使う写真を間違っちゃったようですねーーー

近藤春菜さんを
合成してしまいました!!

とまあ
かなり無理やりですが
合成できてしまうのが
プログラムの悪い所

右京さんもびっくりです。

川口春奈さんを
濃姫に合成した結果は
動画の方をご覧くださいませ。


それでは

とある女優さんが
やらかしましたが

これからの時代は
代役に顔を差し替えて放送できる時代が
やって来るんではないかと思います。

沢尻エリカさんを
山本舞香さんに変えてみました。

これなら
来年の大河ドラマも放送できるよーwww

解説動画はこちら


はい
と言うことで

やり方を簡単に説明します。

まずは動画を静止画に切り出します。

opencvを使えば
動画から静止画に
変換できます。

切り出し方は
次のようなコードで行うことができます。

import os
import cv2

def get_frame_img(video_path, dir_path, basename, ext='jpg'):
    cap = cv2.VideoCapture(video_path)
    if not cap.isOpened():
        return

    os.makedirs(dir_path, exist_ok=True)
    base_path = os.path.join(dir_path, basename)
    digit = len(str(int(cap.get(cv2.CAP_PROP_FRAME_COUNT))))

    n = 0
    while True:
        ret, frame = cap.read()
        if ret:
            cv2.imwrite('{}_{}.{}'.format(base_path, str(n).zfill(digit), ext), frame)
            n += 1
        else:
            return

get_frame_img('IMG/sawaziri.mp4', 'IMG/sawaziri', 'sawaziri')

これでmp4ファイルを
jpgファイルに切り出します。

次にこのファイルたちの顔を入れ替えます。
入れ替える所は自作で作りましょうwww

入れ替えたらそれを動画に連結します。


下記のようなコードで
行うことができます。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

fig =plt.figure(figsize=(16,9))
ims = []
for a in range(9,18):
    img = face_swapping2('IMG/yamamotomaika3.jpg','IMG/sawaziri/sawaziri_{:02}.jpg'.format(a))
    line = plt.imshow(img)
    ims.append([line])

ani = animation.ArtistAnimation(fig, ims)
b = ani.save('anim.mp4', writer="ffmpeg")

さて出来上がったmp4を表示するのは
from IPython.display import HTML
HTML(ani.to_html5_video())

このようなコードになります。
これでjupyter notebook上でみることができます。

素材をきちんと撮れば
違和感のない形で
スワッピングできるのではないかと
思いますね。

今後は
ドラマなどで撮り終えてしまったものも
こういった技術が発達すれば
代役にすぐに差し替えて
放映することができるように
なるんじゃないかと思いますね。

自分のプログラムは
まだまだ発展途上ですが

普通に差し替えできる
未来が待っていることでしょう。

皆さんも
自作して
ぜひ試してみてください。

それでは


先日作った
顔交換アプリケーションで
まあまた遊んでみました。

先日作ったやつの解説は
コレ



今回の
解説動画はこちら

 

はい
opencvと顔認識を使って
顔の特徴点から
顔の抽出して互いの顔を交換していきます。

結果はコレ
matukototatibana

右側の立花さんにマツコさんを被せたのは
すごく異質な感じしますねーーー

化粧もしているしね

左側の
マツコさんに立花さんの顔を被せたのは
そこまでの違和感がないですねーーー

すっぴんの顔だって言っても
何人か信じてしまうような感じに仕上がってますwww


はい
このような顔交換も
opencvを使えば
簡単にできてしまいますので

是非試してみてくださいね

それでは


このページのトップヘ