Takunojiの日記

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

Blender Python + OpenCV〜輪郭の表示〜

前回は、画像を読み込みそれをテクスチャとしてオブジェクトに貼り付けました。

今回は、読み込んだ画像を、グレースケール(灰色)で読み込み、
輪郭を表示します。

早速コードを見てみましょう。
※下のリンクからソースをダウンロードできます。

20180212_A.py ----------------------------------

import os
import bpy
import numpy as np
import sys
sys.path.append('/usr/local/lib/python3.6/site-packages/cv2/')

import cv2


fileName = os.getcwd() + '/BlenderPython/img/images.jpeg'

im = cv2.imread(fileName,0)

thresh = cv2.Canny(im, 100, 200)

cv2.imshow('test', thresh)
#cv2.waitKey(0)
#cv2.destroyAllWindows()

-----------------------------------------------------------------------

イメージファイルを読み込むまでは、前回と同じコードです。
「Canny法」と言うアルゴリズムを使用していますが、意味がわかりませんでした(笑)

実行結果は以下になります。

【元の画像】

f:id:Takunoji:20180212154147p:plain

【出力結果】

f:id:Takunoji:20180212154218p:plain

輪郭を表示するまでには、グレースケール(灰色)で画像を読み込む必要があります。
>im = cv2.imread(fileName,0)

 第二引数の「0」がグレースケールで画像を読み込むためのフラグの様です。
詳細は、下のサイトを参照してください。

画像のしきい値処理 — OpenCV-Python Tutorials 1 documentation


そして、シンプルに「Canny法」を実装した「Canny」を使用します。
>thresh = cv2.Canny(im, 100, 200)
第二、第三引数の数値は、参考サイトにあったのでそのまま設定しました。

詳細は、下のサイトを参照してください。

Canny法によるエッジ検出 — OpenCV-Python Tutorials 1 documentation


以上が輪郭を表示するまででした。
ついでなので他のファイルも少しアップいたします。

【豚さん】
before                                                        after

f:id:Takunoji:20180212160040p:plain                 f:id:Takunoji:20180212160104p:plain

 

【イラスト】

before                                                       after

f:id:Takunoji:20180212160148p:plain                               f:id:Takunoji:20180212160220p:plain

以上でした。

次回は、取得した輪郭から輪郭線の座標を取得します。

Blender Python + OpenCV〜画像読み込みとテクスチャ〜

前回OpenCv(python)を使用して画像の読み込み、サイズの表示を行いました。
OpenCvの逆引きサイトなどを参考に3Dモデル作成。。。なんて考えましたが。。。

人間一歩ずつ歩まなければ身につくものも身につきません。(言い訳です)
と言うわけで、今回は
読み込んだ画像をテクスチャとして表示します。

参考にするサイトはこちらになります。

コードのみのサイトでした。以下のコードです。

def material_for_texture(fname):
    img = bpy.data.images.load(fname)

    tex = bpy.data.textures.new(fname, 'IMAGE')
    tex.image = img

    mat = bpy.data.materials.new(fname)
    mat.texture_slots.add()
    ts = mat.texture_slots[0]
    ts.texture = tex
    ts.texture_coords = 'UV'
    ts.uv_layer = 'default'

    return mat

結局は、
1.ファイル(フルパス)→「C:¥XXX¥XXX¥ファイル.png」などをロード
2.マテリアルを作成
3.テクスチャにセット
とやっていました。
はじめの方に余計なコードがありますが、以下のコードを実行しました。
※Gitより以下のソースをダウンロードできます。

20180211_B.py -----------------------------------------------

import os
import sys
import bpy

sys.path.append('/usr/local/lib/python3.6/site-packages/cv2/')

import cv2

fileName = os.getcwd() + '/BlenderPython/img/Dojo.png'
# this is Normal Loading
#image = cv2.imread(fileName)

# this is GrayScale Loading
image = cv2.imread(fileName, cv2.IMREAD_GRAYSCALE)

# Create Material
mat = bpy.data.materials.new('ImageMat')
# Create Texture
tex = bpy.data.textures.new(fileName, type='IMAGE')
tex.image = bpy.data.images.load(fileName)

# Add material slots
mat.texture_slots.add()
mat.texture_slots[0].texture = tex

obj = bpy.context.scene.objects.active
obj.data.materials.append(mat)

-----------------------------------------------

 

f:id:Takunoji:20180211163148p:plain

汚い感じになっていますがイメージファイルをテスクチャとして表示しております。
はじめの方にある「cv2.cv2.imread(fileName)」などは、今回は関係ありません。。。

次回は、画像の輪郭を読み込もうと思います。


Blender Python + OpenCV〜画像読み込み〜

前回は、OpenCvPython版?(opencv-python)のインストール及び参照追加のための
各種設定などを行いました。

今回は、OpenCvで読み込んだ
イメージファイルの情報をコンソールに表示
します。
前提として、前回のOpenCv-Pythonをインストールしている必要があります。

でわでわ

いつも通りにBlenderを立ち上げます。
ここで言う「いつも通り」とは、以下の手順です。
1.Mac: ターミナル、Win: コマンドプロンプト、を立ち上げてBlenderを起動する
2.Blenderの画面上に「テキストエディタ」「パイソンコンソール」を表示

コードとか記載済みですが、以下の様なイメージです。

f:id:Takunoji:20180211114521p:plain

そして、前回インストールした「cv2」をインポートします。
import sys
sys.path.append('cv2をインストールしたディレクトリ') # soファイル名に注意
import cv2


適当なイメージファイル(PNG, JPG, JPEGなど)をロード(読み込み)します。
image = cv2.imread('../imgs/Dojo.png') # ここのパスは変更してください

サンプルコードには、os.getcwd()を使用しています。
→現在参照しているディレクトリを取得するメソッドです。

そして、読み込んだイメージファイルから各値(プロパティ)を取得します。
結局は読み込んだイメージオブジェクトのshapeプロパティを表示するだけですが
それぞれ、高さ、幅、チャネル数を示します。
※チャネル数に関してはよくわかりませんでした。

ソースは以下の様になります。
height, width, channels = image.shape[:3]

最後の「:3」はタプルの要素を指定するコードの様です。
そして、表示結果が以下の様になります。

f:id:Takunoji:20180211121931p:plain

ちょっとつまらない感じですが、これから面白くなる予定です。

ソースコードは以下になります。
※リンクからGitへ飛び、ダウンロードできます。
20180211_A.py ------------------------------------------

import os
import sys
sys.path.append('/usr/local/lib/python3.6/site-packages/cv2/')

import cv2

# this is Normal Loading
#image = cv2.imread(os.getcwd() + '/BlenderPython/img/Dojo.png')

# this is GrayScale Loading
image = cv2.imread(os.getcwd() + '/BlenderPython/img/Dojo.png', cv2.IMREAD_GRAYSCALE)

width = 0
height = 0
channels = 0

print(image.shape)

if image is None:
print("File is None!")
sys.exit(1)

if len(image.shape) == 3:
height, width, channels = image.shape[:3]
else:
height, width = image.shape[:2]
channels = 1

print("width; %d" % width)
print("height; %d" % height)
print("channels; %d" % channels)
print("dtype;" + str(image.dtype))

-----------------------------------------------------

こんな感じになります。
さて、次回は、どこから手をつけようか?
とりあえずは、OpenCvを使いたいので以下のサイトを参照しようと思います。

OpenCV.jp : OpenCV逆引きリファレンス — OpenCV-CookBook

Blender Python + OpenCV〜インストール〜

前回は、アドオンを起動するとき停止するときにそれぞれ「こんにちは」「さようなら」を言うアドオンを作成しました。

今回は
Blender Python上にOpenCvをインストールしよう
と言う試みです。
ちなみにMacOSXでの手順になります。がWinでも同じ様なことが起きるかも?

そして、以下のサイトを参考に実行しました。

「pipコマンドのインストール」

blender.stackexchange.com

opencv」のインストール

qiita.com

 

参考サイトを参考にしてやればインストール自体は難なく行きました。
問題はその後でした。
OpenCvをOS上にインストールするまではOKでした

大雑把に
1.「homebrew」コマンドで「pip」コマンドをインストール
2.「OpenCv」を「pip」コマンドでインストール
完了ってな感じでした。。。がここで終わらないのが人生の常(笑)

【問題その1】BlenderのPythonConsoleにて以下のコードを実行するとエラーが起きる
>> import cv2
Traceback (most recent call last):
File "<blender_console>", line 1, in <module>
ImportError: No module named 'cv2'

結局のところは、「cv2」→OpenCvが見つかりませんよ。と言うことなので
パスを通してやればおっけーな訳です。
Pythonコードでは以下の様に記載してやれば良い
>>> import sys
>>> sys.path.append('追加するパス')

【問題その2】どこのパスを通してやれば良い?
さらに疑問点が二つ、
・「PythonなのにOpenCvでダウンロードしたものがpyファイルではない」
・「Python自体に2.Xと3.X、どちらがBlenderで使用しているものかわからない」

こんな感じで、OpenCvの読み込みをやり始めました。
そんなこんなで、上記の問題点及び疑問点は以下の様に解決しました。

お尻から解決して行きました。

<解決【問題その2】>
PythonなのにOpenCvでダウンロードしたものがpyファイルではない」に関して
これはダウンロードするものが違ったと言うことでした。
>pip install opencv
上のコマンドが悪かった。。。これはPythonの方ではなかった。。。
>pip install opencv-python

こちらのコマンドが正しい、初めのコマンドだと以下の様にインストールされた

f:id:Takunoji:20180210171210p:plain

みるからにPythonのインストール後ではない(〜.pyファイルがないため)
そして「おかし〜な〜」なんて思っていましたが案の定間違っていました。

Python自体に2.Xと3.X、どちらがBlenderで使用しているものかわからない」

そして、こちらのケースはなんとかpipコマンドでインストールしたもののインストールしたものが2.Xの方だったのですがBlenderコンソールから起動しても参照されない。
「なんでだろー」と考えていたら「3.Xなのか?」と疑問に思い。。。案の定。。。
と言うわけで、Blenderで使用しているのは3.Xの方のPythonでした。

そして、ラスボス
【問題その1】BlenderのPythonConsoleにて以下のコードを実行するとエラーが起きる
以下のコードをBlenderから起動した時に
>>import cv2
 下の様な感じのエラーメッセージが出ました。
これは、ラズパイでの実行結果の様です。
※エラーログがどこかへ行ってしまい。。。

pi@raspberrypi~$ python cam.py
Traceback (most recent call last)
File "cam.py", line 1, in <module>
    import cv2
ImportError: No module named cv2

内容としては次の様なものでした。
「__init__.py の4行目「from cv2 import cv2 ..」 が見当たりません。」


結局のところは以下の点に集約されます。
「pipでインストールした</usr/local/lib/python3.6/site-packages/cv2>
にはcv2.soファイルがないために上記ディレクトリにある
__init__.pyからインポートするものがありませんよ。」

実際にインポートするのはsoファイルなのですが、自分のインストールディレクトリには、以下の様なものしかありませんでした。

f:id:Takunoji:20180210174023p:plain

仕方ないので、それっぽい名前の「cv2.cpython-36m-darwin.so」をリネームしました(笑)。
実行コマンド
>> cp パス/
cv2.cpython-36m-darwin.so パス/cv2.so

 

結果以下の様になりました。

f:id:Takunoji:20180210174610p:plain

f:id:Takunoji:20180210174647p:plain

次回は、画像の読み込みからどの様なデータが取得できるのか検証してみようと思います。

Blender Python Add-on〜作ってみよう〜

前回、Pythonを使用してプリミティブ型のオブジェクトをプログラムから描画してみました。

今度は、アドオンを作成してみようと思います。
今後作成していくコードをアドオンとして作れたら面白いと思ったからです。


参考にするサイトはこちらです。

Addon Tutorial — Blender 2.65.5 - API documentation

余談ですが、1年くらい前にダウンロードしたPDFを参考にアドオンを作った(写経)

のですが、動かないのでおかしいなと思ったら上記のサイトをみて書き方がなんか違うのでは?と疑問を抱いた次第です。まぁ上記の様なtutorialをみた方が確実なのかな?と思った次第です。

<アドオンの作り方>

・すごくシンプルにアドオンを「唵」にすると「Hello World」。「オフ」にすると「Good bye World」と表示されるアドオンを写経してみます。
-------------------------------------

bl_info = {"name": "

", "category": "Object"}
def register():
print("Hello World")
def unregister():
print("Goodbye World")

-------------------------------------

 まずは、頭ごなしに「写経」します。
とりあえず「実行」しそうな感じですが、アドオンなので。。。
テキストエディタで作成し、「FirstAddOn.py」という名前で保存します。

※ファイルをアップロードし忘れていました。。。Gitよりダウンロードできます。

/**********ここからが本番です。 **********************************

* そして、作成したファイルをアドオンとして登録します。
****************************************************************************/

1.ユーザー設定( User Preference)を開きます。

f:id:Takunoji:20180203224919p:plain

 

2.アドオンのタブを選択し「My Test Addon」を検索します。f:id:Takunoji:20180203225035p:plain

ターミナルもしくは、コマンドプロンプトは起動しておく。
そして、アドオンをオン、オフとクリックしてやると

f:id:Takunoji:20180203225511p:plain

上記の様に「Hello World」「Good by World」が表示されます。
うーん、なんかしっくりきました。
まずは、「Hello World」をやる。

ポイントは、bl_infoとregister(), unregister()のメソッドだそうです。
register()で「Hello World」同様に「Good by World」が実装してあります。

なるほど!
では次回(笑)

takunoji.hatenablog.com