プログラミングの最近のブログ記事

詳解 OpenCV
詳解 OpenCV松田 晃一

オライリージャパン 2009-08-24
売り上げランキング : 3148


Amazonで詳しく見る
by G-Tools


オライリーから出版されている洋書「Learning OpenCV」の日本語版、「詳解 OpenCV」が8月22日に発売になります。
amazonから予約できます。

この本では何と、工学ナビの橋本さんと一緒に「Webカメラで手や物体を感知するディスプレイ」という特別付録を書かせていただきました。
また、日本語版の特別付録としてはその他にも、「iPhone OSへのOpenCV/FaceDetectionの移植と高速化」などがあります。

付録では、「ARToolKitの物体認識 その② 指認識」で使用した「手認識」に関する技術の解説等も行っています。

disttrans01.jpg   labeling01.jpg  

今回のプログラムで使用した関数など、こちらの本に詳しい解説や数式などが載っており、理解するのにとても役立ちました。
非常にお勧めです。


パブリックドメインソースを公開したので、次にプログラムをまとめたものを公開します。

FingerDetect1.0.zip


-- < プログラムの使い方 > ---

0.Webカメラが2つあることが最低条件です。
ちなみに僕のは"Qcam Pro for Notebooks"。他のカメラでは試していないので、動くかどうかはわからないです。
あと、2つのカメラの設定を同じにしてください。
1.2つのカメラの向きを平行にして、まっすぐに並べる。
2.緑色のキャップのようなもの(作者は風船を使用)を用意し、それを親指に付けます。
3.TwoViewに関する説明(http://render.s73.xrea.com/pipe_render/2008/05/artoolkittwoview.html)を読み、"WDM_camera_flipV_01.xml"、"WDM_camera_flipV_02.xml"を作成し、Dataフォルダに入れる。
4.マーカーと手を表示し、マーカーと指の距離が表示されることを確認します。
5.親指と人差し指を近づけて、カーソルがクリック状態になるかどうか(2つの指の間の線が赤くなる)を確認します。
6.マーカー上の立方体に指近づけて、クリック状態にします。
7.クリック状態で指を移動すると、立方体も移動します。
8.立方体の移動中にクリックを解除すると、立方体の移動が止まります。



--- < ソースの概要 > ---

今回のプログラムでは、いくつかのクラスを追加しました。
・CHandContourクラス:手の輪郭線を扱います。指の認識などを行えます。
・CPointActionクラス:複数の点を用いたカーソルアクションを行います。

こちらについては、近いうちにドキュメントを公開する予定です。



ソースの公開ですが、まず最初に新規に作成した指認識のソースだけ公開いたします。
これは一応ライセンス上の体裁を整えるためだけの行為なので、この後にまとめたソースをちゃんと公開いたします。

というのも、このソースについてはGPLライセンスではなく、パブリックドメインになっています。
なので、この部分だけ分離し、先に公開しました。

(実際にはここまで厳密にやらなくてもいいと思いますが。


指認識部分のソース:
CHandContour1.0.zip



パブリックドメインソフトウェア(PDS)については以下のよう説明されています。
Wikipedeia:パブリックドメインソフトウェア

ここで、日本では著作人格権を放棄できないので、以下のようにしなくてはいけないと書かれています。

...「将来にわたって著作権(及び著作者人格権)を主張しないことを宣言する」などと明記することによって、事実上の PDS として扱われる...

これによりこの部分のソースについては、利用者は著作権による制限なしにソフトウェアを利用することができます。GPLのような「ソース公開の義務」も発生いたしません。


それから今回、コメントをdoxygenの形式に対応いたしました。近いうちにドキュメントを作成し、公開する予定です。

指が認識できたら、これをポインティングデバイスとして利用します。

これで、普段僕らがやっている「手で掴む・離す」という作業をそのままUIとして利用できるので、より自然な操作が可能になるはずです。




--- < 概要 > ---

今回、「つまむ」という動作を検出するために、以下の2つが必要になりました。

・親指の判断
・指がくっついた状態でも手の領域が重ならないようにする

この問題を解決するために、親指に緑色のキャップを装着しました。

これで、指先に緑の領域がある場合は親指であると判定でき、さらに指がくっついた状態でも、キャップの緑が邪魔をして肌色領域が混ざるのを防ぐことができました。

ここで指がくっついた状態では、親指じゃない方の指が親指だと判定される現象が発生しましたが、そのときの2つの指の座標はほぼ同じになるので、あまり問題ありませんでした。



ポインティングのために行った処理を説明します。

1.指を認識する
2.親指を探す
3.親指と他の指との距離を測る
4.距離がある程度近い場合はドラッグ開始
5.ドラッグ中に距離が離れたら、ドラッグ終了

それぞれの詳細は以下の通りです。



--- < 1.指を認識する > ---

指の認識は、前回の処理とほぼ同様です。
今回追加した処理では、左右のカメラで指を一致させるために、指のマッチングを行いました。

左右画像での指のマッチングは単純で、基準の位置座標を各指を元に変えながら、その他の指の距離を測定し、最も近いものを探しているだけです。

マッチングで指先だけでなく、指の付け根も比較対象に加えることで、マッチングの精度が上がりました。さらに指認識の精度も上がります。

finger_match01.jpg



--- < 2.親指を探す > ---

親指には緑のキャップがあるはずなので、各指先でその緑を探します。
そして、最も緑の領域が多い指を親指であるとします。

find_thumb_01.jpg

また、親指のマッチングも行います。

match_thumb_01.jpg



--- < 3.親指と他の指との距離を測る > ---

左右の画像で一致した指の座標が取得できたので、前回と同様三角測量で指の3次元座標を計算します。

全ての指の3次元座標が分かったら、親指とその他の指との距離を計算します。そして、距離が最も近い指を探します。



--- < 4.距離がある程度近い場合はドラッグ開始 > ---

近い指までの距離が分かったら、その距離がある値より小さいかどうか調べます。そして、小さいときに「つまんでいる状態」のフラグを立てます。

「つまんでいる状態」で立方体との衝突判定を行い、
衝突していたら、ドラックを開始します。

ドラッグ中は立方体が指に追従して移動します。



--- < 5.ドラッグ中に距離が離れたら、ドラッグ終了 > ---

親指と近傍の指との距離が一定値より離れた場合、
「つまんでいる状態」フラグを下げます。

ドラッグ中に「つまんでいる状態」フラグが下がったら、ドラッグを中止します。これでドロップができます。

最後のドラッグ&ドロップは、前回の色認識ポインティングと同様です。


さて、現在ARToolKitのソースの公開に向けた準備を進めている最中ですが、
そこで避けては通れない問題があります。

GNU General Public License(以下GPL)の問題です。(wikipediaのGPL解説ページ



----- <GPLの大まかな説明> -----

ARToolKitのソースのライセンスは、このGPLになっています。
ここでは、GPLについて簡単な説明しかしないので、詳細については他のHPを参照ください。
また、"説明が間違っている"、とか"説明が足りない"部分もあるかもしれません。ご注意ください。

ということで、GPLを(誤解を恐れず簡単に)説明すると、以下のような内容になります。

「GPL付きのプログラムを変更し、再配布する場合は、必ず変更したソースコードも一緒に配布しなくていけない」



GPLでは、入手したプログラムを個人や社内"のみ"で使用している場合には、何の制限もありません。
また、プログラムを使用して書き出された出力結果についても、ほとんどの場合扱いは自由です。

しかし、その実行ファイルやソースを配布しようとした時には、いくつかの制限がつきます。
その1つが、改変したソースコードも必ず、全て公開しなくてはいけない、というものです。

もし、それらの制限が守れないのであれば、実行ファイルやソースの配布は絶対にできません。


ですが実際に、これらの制限をちゃんと守っている人がどれくらいいるのかは、ちょっと怪しいところです。
企業であれば、GPL違反は"ソースの公開又は配布の停止"という非常に重い罰則になるので、どこもGPLには気をつけているはずです。

しかし、個人で公開しているフリーウェア等の場合、"ソースの公開又は配布の停止だけ"という罰則は非常に軽いです。
しかも、ARToolKitのようなプログラムならまだしも、そのアプリがGPL違反かどうかなんて、実行ファイルだけでは普通分かりません。




という背景はありますが、僕自身は「規則だから」という問題は抜きにしても、GPLをちゃんと守ってソースを公開したいと思います。(まぁ理由は後で

さて長くなりましたが、では実際にARToolKitで作ったプログラムを公開する際に、注意すべきことを書いてみます。



----- <ARToolKitのGPLで、問題になるのは?> -----

・僕がARToolKitのプログラムをダウンロードし、プログラムを変更する 
→ ○問題ない
 公開しなければ、何も問題ありません。

・改変したプログラムを実行、その出力結果をWebに公開する 
→ △内容にもよるが、概ね問題ない
 実行結果で、ソース自体を出力しないのであれば、問題ありません。
 実行結果のみなら、動画を公開しても大丈夫です。

・もし、このプログラムの実行ファイルのみを、Webに公開したら 
→ ×GPL違反
 ソースの公開等の制限を実行するか、その旨の文章を入れないといけない。

・ARToolKitで使われている画像(マーカーパターンなど)を改変、公開 
→ △場合によりけり
 画像データ等がプログラムの一部として判断されるかは微妙です。
 しかしそうだとしても、僕の場合は改変した画像も既に公開されているので、問題はないと思います。(ソースも必ず完全公開しますし



----- <GPLに違反したら?> -----

上にも書いたように、少なくてもARToolKit(GNU GPL Ver2)の場合は、
ライセンスに書かれている制限(「ソースコードを公開する」又は「配布を停止する」、など)以外の罰則はないようです。



----- <実際に配布時に行わなければいけないこと> -----

これに関しては、GPLの日本語訳が分かりやすいです。
重要そうな所を一部、ARToolKitの例で説明しますと。

●ARToolKitを元に作られたプログラムを配布する時は、その変更箇所を全て公開しなくてはいけない。

●その時に、変更した旨とその変更日とを、そのファイル上に書かなくてはいけない。

●プログラム実行時に著作権等の注意事項を出力する。

●GPLのライセンスが書かれたテキスト(COPYING.txt)を、配布ファイルの中にも入れておくこと。
等々があります。詳しくは、上記リンクを参照してください。



----- <GPLはなんのためにあるのか?> -----

といったように、少し面倒なGPLですが、これにはちゃんと理由があります。

GPLの目的とは、「フリーウェアが誰かの手によって独占的に保持されるのを防ぎ、
ソースを共有することによって、フリーウェアを発展させていきましょう」というものです。

この考え方は、クリエイティブ・コモンズにも似ていますね。
コピーレフトというものらしいです。

ということで、僕はARToolKitがもっと発展してほしいと思っているので、GPLを推奨します。



----- <最後に> -----

何度も書かれているように、なにぶん僕も勉強不足な面があるので、間違ってたり、説明足らずな部分があると思います。
なのでGPLについては、ここを信用しないよう、ご自身でちゃんと調べてください。

また、そういった点があった場合、コメント等に指摘をいただけるとありがたいです。
GPLに関する質問については、答えられないかもしれないです。申し訳ないです。

このアーカイブについて

このページには、過去に書かれたブログ記事のうちプログラミングカテゴリに属しているものが含まれています。

前のカテゴリはWebです。

次のカテゴリは拡張現実です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

プログラミング: 月別アーカイブ

Powered by Movable Type 4.01a