昨日PythonやOpenCVを用いて画像の姿勢推定を行いました。
今回はBlenderで外部からスクリプトを実行できるか試して行きます。
目的としては単純な興味もありますが、BlenderからBlender環境外のスクリプトを実行してその情報を取得できればいろいろと使いどころがあると思ったためです。
〇環境
・Windows11
・Blender4.0
その他は以前の記事を参照ください
〇Blenderで外部スクリプトを実行する
単にPythonスクリプトを実行する場合と異なり多くの場合はPythonの仮想環境ごと実行されます。
これを実現するためには実行するPythonスクリプトのほかにPythonのインタープリタのパスが必要となります。
import bpy
import os
import subprocess
# 外部Pythonスクリプトのパスを指定します
script_path = r"C:\Users\seiri\Documents\PythonStudy\ComputerVision\pose.py"
# AnacondaのPythonインタープリタのパスを指定します
python_path = r"C:\Users\seiri\anaconda3\python.exe"
# スクリプトが存在するか確認します
if not os.path.exists(script_path):
print(f"スクリプトが見つかりません: {script_path}")
else:
# subprocessを使用してスクリプトを実行します
result = subprocess.run([python_path, script_path], capture_output=True, text=True)
# 実行結果を表示します
print(result.stdout)
今回の場合はAnacondaで作成しているPythonインタープリタ(環境)のパスを指定して実行する必要があります。
このパスの調べ方はAnaconda Pronptで次のようなコマンドで取得できます。
(base) C:\Users\>conda activate opencv-env #環境の定義 (opencv-env) C:\Users\seiri>where python
where pythonコマンドはPythonのパスを調べるコマンドになります。
これを実行すると次のようなパスが出力されます。(実際の結果はローカル環境によって変わります。)
C:\Users\(ユーザー名)\anaconda3\envs\opencv-env\python.exe C:\Users\(ユーザー名)\AppData\Local\Microsoft\WindowsApps\python.exe
Windowsの場合システム全体でpythonがインストールされているすべての場所を返します。
今回の場合はAnaconda環境パスが必要のためC:\Users\(ユーザー名)\anaconda3\envs\opencv-env\python.exeが求めているパスになります。

これにより外部のPythonスクリプトを実行することができます。
〇出力結果の取得
import bpy
import os
import subprocess
def load_result_image():
# 画像ファイルのパス
image_path = r"test.jpg"#任意のパスに変更してください
if not os.path.exists(image_path):
print(f"画像が見つかりません: {image_path}")
else:
# 画像を読み込み
image = bpy.data.images.load(image_path)
#マテリアルの作成
material = bpy.data.materials.new(name="ImageMaterial")
# マテリアルを使用するノードを作成
material.use_nodes = True
for node in material.node_tree.nodes:
print(node.name)
bsdf = material.node_tree.nodes["Principled BSDF"]
# テクスチャノードを作成
tex_image = material.node_tree.nodes.new('ShaderNodeTexImage')
tex_image.image = image
# テクスチャノードをBSDFノードに接続
material.node_tree.links.new(bsdf.inputs['Base Color'], tex_image.outputs['Color'])
# アクティブなオブジェクトに新しいマテリアルを適用
obj = bpy.context.active_object
if obj.data.materials:
# マテリアルがすでに存在する場合は、最初のマテリアルを置き換え
obj.data.materials[0] = material
else:
# マテリアルが存在しない場合は、新しいマテリアルを追加
obj.data.materials.append(material)
# 外部Pythonスクリプトのパスを指定
script_path = r"pose.py"#任意のパスに変更してください
# AnacondaのPythonインタープリタのパスを指定します
python_path = r"python.exe"#任意のパスに変更してください
# スクリプトが存在するか確認
if not os.path.exists(script_path):
print(f"スクリプトが見つかりません: {script_path}")
else:
# subprocessを使用してスクリプトを実行します
result = subprocess.run([python_path, script_path], capture_output=True, text=True)
print(result)
# 実行結果を表示します
print(result.stdout)
load_result_image()#画像のロード
これを実行することで処理後に結果の画像をロードすることができます。

今回でBlenderで外部のPythonスクリプトを実行して結果を読み込むことができました。
応用すれば様々な処理がBlenderでできそうです。