2012年4月6日金曜日

MacBookAir(10.7 Lion)でHandyAR その3

今のところLionだからという感じの問題に遭遇していないので、タイトルが釣りっぽいなーと思ったりしながらの3日目です。

ということで今日は前回の続きということで、固まっている原因はどこか、ソースコードを確認していきたいと思います。


先に結論

とりあえず先に結論だけ書いてしまうと、固まっているように見えたのは、前処理にものすごい時間がかかってただけでしたw
ということで、無事動くまでの経緯を…。

困ったときのprintfデバッグ

まずはどこまで無事に動作するかを確認するため、ひたすらprintf()デバッグを敢行しました。
なぜかNetBeansのデバッガが使えなかったので

すると、HandRegion.cppのloadSkinColorProbTable()ってところがどうも怪しいのでよーく確認すると、

51行目〜
        printf("making a lookup table for skin color distribution ");
        _SkinColor.MakeLookUpTable();
        printf("done\n");

この部分で止まっているようです。
ということでMakeLookUpTable()を探してみると、MixGaussian.cppにあったので、中を覗くと…、

118行目〜
void MixGaussian::MakeLookUpTable()
{
    CvMat * SampleMat = cvCreateMat( 3, 1, CV_64FC1 );

    for ( int R = 0 ; R < 256 ; R ++ )
    {
        printf(".");
        for ( int G = 0 ; G < 256 ; G ++ )
        {
            for ( int B = 0 ; B < 256 ; B ++ )
            {
                cvSetReal1D( SampleMat, 0, (double)R );
                cvSetReal1D( SampleMat, 1, (double)G );
                cvSetReal1D( SampleMat, 2, (double)B );

                _Probability[R][G][B] = GetProbability( SampleMat );
            }
        }
    }
    
    cvReleaseMat( &SampleMat );
}

3重ループかー…
どうもここの計算に時間を取られていたようです。
しかもprintf(".")って、改行コード出してないからインジケータとしての意味が無いですし…。

そんな訳で、インジケータをわかりやすく(R=20ごとに改行)変更したところ、無事に動いていることが確認でき…、


てない…orz
コードを確認すると、上の処理の直後にnonskin.mgmというファイルを読んでいるのですが、追加されてませんでした。
なので、nonskin.mgmファイルを追加した後、改めて実行。

そして待つことしばし…



動いた!!!(・∀・)
でも上下反転してますね…(;´∀`)

付属のドキュメントを見ると、flipオプションというのがあり、
-  [-filp]: flip video images vertically. (Default=don’t flip)    
とのこと。

なので、実行時に -flip を渡して再度実行…、


ktkr!!!


ということで、ひとまずMacでも動くことが確認できたので、次回はミクさんに登場して頂けるように頑張りましょうw

0 件のコメント:

コメントを投稿