メニュー 閉じる

150. TouchDesignerのPythonでOpenCVを実装してみる01

148、149でPythonのOpenCVによる動体の追跡を試してみました。そこで、このPythonコードを
TouchDesignerに実装できないかということで、いろいろやって2日ほどハマりました。



148、149ではPython単体で動かしていたのですが、やはり額面通り移植してもエラーだらけです。
いずれにしても、ウェブカメラからの映像をOpenCVで処理するわけですが、Python単体での
ビデオ入力とTouchDesignerのビデオ入力ではやり方違います。

Python単体の場合

cap = cv2.VideoCapture (0)

ret, frame = cap.read ()

Touchdesigner + Pythonの場合

Video Device In TOPでカメラからの入力を受けます。そしてOP Execute DATでそのTOPを
監視しながらフレームの画像情報を受けます。

def onPostCook (changeOp):

	frame = changeOp.numpyArray ()

 

上記のコードでは、Python単体の場合もTouchdesigner + Pythonの場合も、映像の各フレームの
画像情報は「frame」に入ります。これは3次元の配列になっていて、ピクセルY座標、ピクセルX座標、
ピクセル色情報となっています。で、ハマったのは、

frame = cap.read ()
frame = changeOp.numpyArray ()

には全く同じものが入ってるだろうと思ったからです。実はこの2つではピクセル色情報の部分の
内容が違っていて、

Python単体の場合
[Blue, Green, Red] (値の範囲は0〜255)

Touchdesigner + Pythonの場合
[Blue, Green, Red, Alpha] (値の範囲は0〜1)

ということでした。死ぬほどPrint ()してやっとわかりました。なので、Touchdesigner + Python
の場合はOpenCVに渡すために、Python単体のデータフォーマットに変換することになります。

# VideoDevice In TOP からの入力
frame = changeOp.numpyArray (delayed = True)

# [Blue, Green, Red, Alpha]の最初3つだけ抜き出す(Alphaを省く) f_arr = frame[:, :, 0 : 3]

# 0〜1のデータを0〜255へ f_arr = f_arr * 255.0

# 8ビット符号なし整数に変換 f_arr = f_arr.astype (np.uint8)

 

ということで、ようやくTouchDesignerでOpenCVによる動体追跡(CamShift)ができました。

Posted in python , touchdesigner