1.openFrameworksで物体検知とOSC通信
openFrameworks(以下oF)で物体検知(Object Detection)を動かし、その結果をOSC通信で送る方法です。
※自分は卒業制作ではオリジナルのモデルを作成しましたが、それはまた別の記事で書こうと思ってます。この記事では、元々用意されているモデルを使用する方針で書いています。
物体検知
物体検知には以下のaddonを使用します。
https://github.com/TetsuakiBaba/ofxOpenCvDnnObjectDetection
これをoFのaddonのフォルダー内にcloneします。
cloneのやり方はこのサイトを参考にすればできると思います。https://docs.github.com/ja/github/creating-cloning-and-archiving-repositories/cloning-a-repository
このaddonの中のExamplesに、osc_senderというのがあるので、その中のxcodeprojectを開きます。
addon/ofxOpenCvDnnObjectDetection/Examples/osc_sender/osc_sender.xcodeproj
詳しいコードの内容は、下で記述します。
コード以外で私が詰まったところを先に記しておきます。(当たり前といえば当たり前なんですが…)
gitからcloneしてきたもののままでは動かないので、binの中を整理します。
osc_sender/bin/data/dnn
この中に"coco.txt"と"voc.txt"と"yolov3-tiny.cfg.1"というのがあります。
これらの名前がofApp::setup()内のdetector.setup()のなかに書いてある名前と一致してないといけません。(当たり前)
物体検知を動かすには、cfgファイルとweightsファイルと、ラベルの名前が書かれたtxtファイルが必要です。なので、"coco.txt"はそのままで大丈夫です。"voc.txt"は必要ないです。"yolov3-tiny.cfg.1"は、最後の".1"を消し、ofApp::setup()内の22行目のところを直します。
weightsファイルはここからダウンロードできます。
これで多分動きます。頑張れ。
あとは問題ないと思いますが、ざっくりコード内でやっていることを言うと、ofApp:update()の中で、カメラ画像が更新されたらdetectorも更新するという処理をやっていることと、
ofApp::draw()の中で、バウンディングボックスを描画しています。
バウンディングボックスを描画するかどうかは、物体検知を行ったときの自信度によって変化します。その自信度の閾値はofApp::setup()内の
この値(いま0.6となっている)で変えることができます。この値によって、どれくらい物体検知の結果を描画するかを指定できます。
よくわからないと思いますが、とりあえず動かしてみてください。
OSC通信
コードが自分で読める人・OSC通信をやったことがある人は飛ばしてください。
receiverについては、Touchdesignerの記事の方で紹介します。
ざっくりとした説明になりますが、大事なところはまずofApp::setup()内のホストとポートの指定です。
今回はlocalhostで、ポート番号を12345にしています。ポート番号は1024以降ならなんでもよかったはず。この値はTouchDesignerのreceiverでも使用します。
OSC通信の肝の部分は、ofApp::update()内のメッセージを送る部分です。
ここで物体検知の結果を送信しています。
(60行目から)アドレス、ラベル番号、ラベルの名前、bouding boxのx座標、y座標、bounding boxの幅、高さを送信しています。