memorandumsスマートフォン用の表示で見るmemorandums日々の作業ログです。hue値を使った色類似度計算についての試行2015-10-04hue値を使った色類似度計算についての試行openframeworks■前置きまだまだSpherotoon開発を地道に続けています。開発当初から以下の問題がありました。Spheroの操作が難しいShpero同士が衝突するとSphero自体が発行している色と塗る色が異なってしまう2番目の問題の根本はSpheroの色とは関係なく塗る色を決めているところでした。現在のシステム(Shperoを認識してそこに色を塗るシステム)では、Kinectの深度センサーのみでSpheroの位置を認識しているため、Spheroの色が何であるかはわかりません。やっているかというと。スタート時点でSpheroを認識したときに勝手に色を決めてしまっています。最初に見つけたものを緑、次をピンクという具合です。ゲーム開始当初は合っていても、深度センサーでSpheroを見失ったときに極端に位置が変わっているとこの2番目に挙げた問題が発生します。何か方法がないか屋内における位置検出を軸として関連研究を探しました。個体を認識するためにセンサーを追加するとか動きのパターンから個体を特定するとか。様々な手法はありましたがこの例には役立ちそうもありません。考えてみるとKinectには深度センサーの他にカラーのイメージセンサーがついています。これ使えばShperoの色が認識できるかな?と思ったのです。ちなみにこの辺のテーマで実験をされている方がいます。方式は違うので参考にはなりませんでしたが同じようなことを考えて実行している人がいるんだなぁ。ボール型ロボットティックトイ「Sphero」の制御実験をしてみた本題に戻します。やりたいことは、Kinectの深度センサーで見つけたSpheroの位置のカラー情報(具体的にはofColor)をカラーイメージセンサーから取得し、その色が何色か(緑かピンク)を特定して、その色をそのSpheroの色として塗りつぶす色に使おうというトライです。ここで問題がSpheroの色を特定する処理です。最初はRGBで類似度(ピンクらしさ?緑らしさ?)を調べようと実験してみたのですが差異がわかりにくい。Hue(色相)を使うといけるんじゃないかと思い出し、少し試してみるといけそうでした。Wikipediaで、ピンクと緑をoFでそれぞれ以下のように定義してやって、それぞれのhue値をgetHue()メソッドで取得し、カラーイメージセンサーから取得したofColorの値のhue値を同じくgetHue()メソッドで取得し、pinkとgreenのどちらに近いかを判定するコードを書こうとしました。0);ここまでが前置きです。■本題7月くらいから空き時間を見つけて動くことを優先して作ってきたためコードは継接ぎだらけ。数日前からリファクタリングをしながら、最後にこのhue値を使った色類似度計算に行きつきました。ノートにアイデア書いて以下のようなプログラムを作りました。(言い訳ですがラグビーのサモア戦を見ながら飲みながら作っていたので頭はあまり回っていません。)ちょっと補足が必要と思います。ofColorのgetHue()メソッドはHue値を角度ではなく0-255の値で返してくれます。色相は上記のWikipediaの解説の通り環状になっています。0から始まり255の次は0に戻ります。5と250の距離(角度かな?)は10になります。類似度は2つの値の差で求まりそうですが、大小関係があるので絶対値を取ればいいはずです。255から0に戻るところを跨ぐ処理が面倒ですね。あれこれ考えて以下で行けると考えました。d;}とりあえず動かしてみると答えはあってそうです。スマートにできないものかいな?とつぶやいたのが以下です。眠気マックスでしたが。ここまでで就寝しました。hueを使ってある色が他に与えた2つの色のどちらに近いかを計算させる関数を作っている。ofColorのhueは0-255だから境界がある。時計やカレンダでも出てくるなぁ。modではうまくいかんし。結局ifで場合分けを記述する必要がある。3朝、パソコンに向かうと以下のリプライが。