Takunojiのプログラミング・プレイグラウンド(遊び場)

プログラミングのススメとか記載します、今までにやったのは、環境構築、実装方法の説明など、Java, UnrealEngine, Unity, BlenderPython, Discord, OpenCV, TensorFlow(Python), ラズパイ(RPi)などやりました。まだ中途半端ですが。。。

Blender Python 開発 〜imgファイルの輪郭を取得〜

ここ最近は、開発メモやらBlenderの操作方法など横道にそれていましたが。。。
できました!!
「イメージファイルの中身をBlender上に表示する」

作成した、pyファイルはこちらからダウンロードできます。
ちなみに、元々のイメージファイルは以下です。

f:id:Takunoji:20180324214834p:plain

今回のやったことは、以下の通りです。

0. OpenCvを読み込みBlender上で使用できるようにする
1. イメージファイルを読み込む
2. イメージを黒と白のみにする(グレースケール化)
3. グレースケールにしてから輪郭部分を取得
4. 輪郭を取得したイメージより輪郭部分の座標(1px=(x,y))
   ※横をX座標、縦をY座標として取得
5. 新たにvertex(点)を作成

スクリプトを起動した結果です。本当は、作成したPlaneの上に表示させる予定でしたが、Planeの座標は0->1の範囲なのに対して、配列の位置で座標取得を行ったため
以下のようになりました。(笑)

f:id:Takunoji:20180324213725p:plain

ポイントは3つ
OpenCvを使用して輪郭を取得する
・取得した輪郭から点(Vertex)を作成する
・bmeshはエディットモードでないと動かない

現状の実装では、無駄な処理が多分に含まれているので
今後は、効率の良い方法を探そうと思います。

ソースの一部です。

ob = bpy.context.object

bpy.ops.object.mode_set(mode='EDIT')
bm = bmesh.from_edit_mesh(ob.data)

print(len(list)) # 取得した点のはいれつ数を確認
print(list[0])   # リストの中身を確認 

for co in list:
# 点の作成処理
bm.verts.new(co)
# 作成した点を画面に反映
bmesh.update_edit_mesh(ob.data)
# オブジェクトモードに戻す(コメントアウトしてます)
#bpy.ops.object.mode_set(mode='OBJECT')