前回に続きBlenderを使用してMMDの初音ミクの3Dモデルから、マンガキャラクターの顔パーツ検出用学習データの生成を試みる。
BlenderでMMDのモデルを読み込むとそのままでは、シェーディングが有効になっており、レンダリングを行うと陰影のある画像となる。
陰影をなくして、マンガの学習データとして適した画像にしたい。
ゲームやCGアニメなどで用いられているトゥーンレンダリングの技法で、陰影をなくした画像にすることができる。
トゥーンレンダリングは、影の有り無しで2階調で表現するが、マンガ風にするには、影部分は不要なので、1階調とする。
また、輪郭を線で描画する。
Blenderでそれらを行うには、マテリアルのシェーディングをオフにして、Freestyle機能で輪郭に線を描画する。
マテリアルのシェーディングをオフにする
GUIから行うには、Compositingレイアウトで、マテリアルタブを選択し、材質を選んでShadelessにチェックする。
Pythonのコードから行うには、以下のように実行する。
for m in bpy.data.materials: m.use_shadeless = True
顔と背景を白色にする
グレースケール化したときに顔は白色としたいので、材質3(顔)、材質16(目の白い部分)を白色にする。
bpy.data.materials['材質3'].diffuse_color = (1.0, 1.0, 1.0) bpy.data.materials['材質16'].diffuse_color = (1.0, 1.0, 1.0)
背景も白色にする。
bpy.data.worlds["World"].horizon_color = (1.0, 1.0, 1.0)
Freestyle機能で輪郭に線を描画する
DefaultレイアウトでSceneタブ(カメラアイコン)を選んで、Freestyleにチェックする。
またデフォルトでは線が太すぎるので、Line Thicknessを0.5pxにする。
Pythonでは以下のように実行する。
scene = bpy.data.scenes['Scene'] scene.render.use_freestyle = True scene.render.line_thickness = 0.5
この状態でレンダリングを行うと、
このように、鼻の位置に不要な線が描画される。
この不要な線をなくすには、LineStyleタブを選んで、Freesyleのプロパティで、Crease Angleを120°に設定する。
scene.render.layers.active.freestyle_settings.crease_angle = radians(120)
レンダリングを行うと、
このようになり、グレースケール化するとこうなる。
以上のようにして、3Dモデルからマンガに近い画像が生成できる。