Takunojiの日記

自分が勉強したプログラム技術メモ

Blender Python 開発 〜イメージからオブジェクトを作る(説明)〜

前回、イメージから点を表示するところまでやりました。
前回は家紋を表示したのですが、今回は別のものを表示します。

f:id:Takunoji:20180325210325p:plain

ちなみに、上記の画像は表示するパスを変更して実行しています。

元のソースはこちらです。(Gitからダウンロードできます)
一応処理内容を説明いたします。

# 必要なライブラリをインポートします。

import os, sys, numpy as np
import bpy, bmesh

# OpenCvのインストール先をパスに追加する
sys.path.append("/usr/local/lib/python3.6/site-packages/")

# OpenCvをインポート

import cv2
# 家紋のパス
#imgPath = "/Users/takk/BlenderPython/img/kamon/mouri-motonari-kamon.png"
imgPath = "/Users/takk/BlenderPython/img/human_what_is.png"

# イメージの読み込み
im = cv2.imread(imgPath,0)
# イメージを白黒のイメージに変換
thresh = cv2.Canny(im, 100, 200)
x = 0
y = 0
# 画面に出力するための点を設定する配列
list = []
# 取得するか否かの判定フラグ
pickupFlg = False
# 出力するリストへの追加をするしないの判定フラグ
addListFlg = True
# ピクセル格納用変数
tmp = 0
# エディットモードへ変更
bpy.ops.object.editmode_toggle()

# 対象のピクセルをリストへ追加するか判定するメソッド
def judge(col, tmp):
pickupFlg = (not col == tmp)
tmp = col
return pickupFlg

# リストへの追加処理メソッド
def isAddList(addListFlg, pickUpFlg, row, index):
# pickUpFlg = judge(row[index],tmp)
if pickUpFlg and addListFlg:
addListFlg = judge(row[index + 1], tmp)
return pickUpFlg

# 2次元配列の1次元目の配列長
xMax = len(thresh)
# 同様に2次元目の配列長
yMax = len(thresh[0])

# 確認用コンソール出力
print("X: %s Y: %s" % (str(xMax), str(yMax)))

# 配列の中身を取得する処理
for row in thresh:
for col in row:
pickupFlg = judge(col,tmp)
addListFlg = isAddList(addListFlg, pickupFlg, row, x)
if pickupFlg:
# 確認用処理
# print("pick: %s / add: %s" % (str(pickupFlg), str(addListFlg)))
if addListFlg:
# 確認用処理
# print("*** Add List ***")
# 出力用の配列へ追加する
list.append*1
# フラグを反転
addListFlg = not addListFlg
# 取得した配列の位置を示す変数
x += 1
x = 0
y += 1

# 3D_VIEWに出力する準備
ob = bpy.context.object
# エディットモードへ変更
bpy.ops.object.mode_set(mode='EDIT')
# BMeshを使用する(bpy.context.objectより作成)
bm = bmesh.from_edit_mesh(ob.data)

# 確認用
#print(len(list))
#print(list[0])

# 出力配列から点(vertex)を作成
for co in list:
bm.verts.new(co)

# 追加した点を反映
bmesh.update_edit_mesh(ob.data)
# オブジェクトモードへ変更(コメントアウト)
#bpy.ops.object.mode_set(mode='OBJECT') 

そして、この次にはmeshへの変換を行いたいのですが。。。
皆目見当もつかない状況です。

今回、はここまでにします。

*1:y/(yMax-1) ,x/(xMax-1), 0