2008年6月アーカイブ

新しいプログラムは「物体認識」とか凄そうな名前を付けましたが、
基本的にはtwoViewを使ったプログラムの延長です。

今回は、前回のプログラムの色認識を改良しました。
少しずつ純粋なARToolKitから離れてきています。


--- < HSV色空間について > ---

HSVなんて聞きなれない単語ですが、簡単に言うとRGBの親戚みたいなものです。

知っての通り、RGBは「赤・緑・青」の色を組み合わせて多くの色を表現しますが、
HSVでは代わりに「色相・彩度・明度」という属性を組み合わせることで色を作ります。

詳しくは、Wikiを参照してください。


なぜRGBじゃなくてHSVを使うのかというと、こっちの方が特定の色を見つけやすいからです。

Wikiを見てもらえば分かるように、HSVでは赤とか青とかの情報は色相を見れば大体分かります。
残りの彩度や明度は、言ってみれば明るさや暗さみたいなもので、ほとんど無視していいものです。

逆に言えば「明るい赤」も「暗い赤」も、同じ赤として認識してくれることになります。
実際には、物体の「影の部分」や「光が反射している部分」まで認識してくれる可能性がある、
ということです。



--- < 実行結果 > ---

今回は、このHSV色空間で画像を扱うために、OpenCVというフリーの画像処理ライブラリを使用しました。
また指定色の物体は綿棒ではなく、色風船の端を切って指にはめてみました。

LabelRect01.jpg   Labeling01.gif   pointing01.jpg  

HSV色系を用いる以外の処理は、今までと一緒です。
とりあえずはうまくいっているようです。


しかし、欠点もあります。
HSV色系はそのままだと感度が良すぎて、余計なものまで認識してしまいます。

上の画像では、閾値を狭くしたので指の先を正しく認識できていません。
そこで、閾値を広くすると下の画像のようになります。

LabelRect02.jpg   Labeling02.gif

閾値が広いと指の部分を正しく取得できますが、同時に関係ない部分まで誤認してしまっています。

このような結果にならないように、「彩度・明度」も考量しなくてはならず、
「色相」の閾値も、そのつど微調整が必要です。

またこれまで以上に、撮影環境に気を使わなくてはいけないかもしれません。


この辺は今後の課題です。

 

お待たせしました。
twoViewを使った、ステレオマッチングプログラムのソース公開です。

StereoAnyColor1.0.zip


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


0.Webカメラが2つあることが最低条件です。
ちなみに僕のは"Qcam Pro for Notebooks"。他のカメラでは試していないので、動くかどうかはわからないです。
あと、2つのカメラの設定を同じにしてください。
1.2つのカメラの向きを平行にして、まっすぐに並べる。
2.赤・黄・青など特徴的な色の物体を用意し、場所は白いテーブルの上など選んだ色が他にはないような所にする。
3.TwoViewに関する説明を読み、"WDM_camera_flipV_01.xml"、"WDM_camera_flipV_02.xml"を作成。
4.プログラムを起動して"Video Source 1"ウィンドウで、用意した特長的な色の物体を画面に表示して、それを左クリックします。
5.物体が画面に映っている状態で、Fキーを押してラベリング画像を表示。
6.Kキーを押して続けて閾値を下げ、目的の物体が一番大きくラベリングされるようにします。
7.押しすぎて全くラベリングされなくなったら、Jキーを押して閾値を上げます。
8.もう1つの物体を認識させたいときは、右クリックで画面上の物体の色を指定します。
9.2つの物体が一番大きくラベリングされるようになったらOKです、Fキーを押して元の画面に戻ります。
10.マーカーを表示し、マーカーと2つの物体の距離が表示されることを確認します。
11.2つの物体の距離を近づけて、カーソルがクリック状態になるかどうか(2つの物体間の線が赤くなる)を確認します。
12.マーカー上の立方体にカーソルを重ねて、クリック状態にします。
13.クリック状態でカーソルを移動すると、立方体も移動します。
14.立方体の移動中にクリックを解除すると、立方体の移動が止まります。

以上です。
まだ色の識別が甘いので、上手く認識しないかもしれません。
今後の課題です。


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

今回のプログラムでは、いくつかのクラスを追加しました。
・CCamerasRelationクラス:カメラ間の関係
・CStereoAnyColorPointクラス:指定色のステレオ処理を行う
・CFindColorPosInImgクラス:画像認識を行い、指定色のスクリーン上の座標等を計算
・CCamSimpleTriangulationクラス:3角測量を行う

以上のクラスは次のように使います。
1.インスタンスの定義
2.クラスの初期化
3.画像認識の計算
4.結果の取得


--- < 1.インスタンスの定義 > ---

改良したtwoView.cでは、以下のようにクラスのインスタンスを作成します。
CCamerasRelation    gCamRelate(CONTEXTSACTIVECOUNT);
CStereoAnyColorPoint g_stereoOperator;
今回はグローバル変数で定義しました。


--- <
2.クラスの初期化 > ---

次に、この変数を初期化します。
// グローバル変数の初期化
static void InitGlobalValue()
{
    // 画像認識の色を指定
    g_stereoOperator.ClearTargetColor();
    g_stereoOperator.AddTargetColor( g_cnColorRealRed );
    g_stereoOperator.AddTargetColor( g_cnColorRealYellow );

    // カメラの投影行列
    gCamRelate.SetCamParam( 0, arParam.mat );
    gCamRelate.SetCamParam( 1, arParam.mat );
}
CStereoAnyColorPointの初期化では、指定色をAddTargetColorで追加します。
CCamerasRelationの初期化では、SetCamParamで各カメラに透視投影行列を設定します。


マーカーを認識できた時点で、もう1度別の初期化を行います
CCamerasRelationで、カメラ間の関係を計算します
// 2つのカメラが、同じマーカーを認識できてるかどうか
if ( gContextsActive[0].id == gContextsActive[1].id )
{
     // カメラ1の変換行列を保存
     CopyArray3x4ToMatrix4x4( mtrxTemp1, gContextsActive[0].patt_trans );
     CopyArray3x4ToMatrix4x4( mtrxTemp2, gContextsActive[1].patt_trans );

     gCamRelate.CalcRelation(0, 1, mtrxTemp1, mtrxTemp2 );
}
CStereoAnyColorPointでは、新しいカメラ画像をセット
g_stereoOperator.InitImgSource(    arImXsize, arImYsize,
                        gContextsActive[0].ARTImage,
                        gContextsActive[1].ARTImage );



--- < 3.画像認識の計算 > ---

必要な情報をセットできたら、画像処理を行います。
g_stereoOperator.RecognitionColor3DPos(&gCamRelate);
画像処理では、カメラの関係を引数として指定します。


--- < 4.結果の取得 > ---

計算が上手くいったら、結果の3次元ベクトルを取得します

for ( int iTarget = 0 ; iTarget < g_stereoOperator.GetTargetPosCount() ; iTarget++ )
{
    double dPos[3];
    if ( !g_stereoOperator.GetTargetPos(iTarget, dPos) )
        continue;
}
GetTargetPos(const int ciTarget, double dPos[3])で、指定色のベクトルを取得できます。




このアーカイブについて

このページには、2008年6月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2008年5月です。

次のアーカイブは2008年7月です。

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

Powered by Movable Type 4.01a