「3日の調査の末」の編集履歴(バックアップ)一覧はこちら

3日の調査の末」(2012/11/20 (火) 13:58:37) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

前回は惨敗。なんでかっていうとOFのフォーラムになんか使えそうな記事を発見 http://forum.openframeworks.cc/index.php?topic=5031.msg25335#msg25335 ofxARToolKitPlusに触ることなく解決しようと思ったが、クラスの継承がよくわかんなくて惨敗。まあ、作品を作る限定的なことなので、ofxARToolkitPlus.cppをいじってしまおうと決断。ラッパーを作るのがめんどくさいけど。 class TrackerSingleMarker : public Tracker とあるので、TrackerSingleMarkerとTrackerMultiMarkerはTrackerクラスを継承しているとわかる。C++のクラスについてよくわかっていないので、勉強する。 http://www.geocities.jp/ky_webid/cpp/language/012.html より "new演算子を使うとメモリの動的確保が行え、delete演算子によって解放することができます。ここで注意して ほしいのですが、newとdeleteは演算子です。mallocやfreeは関数です。この違いには重要な意味があるのです" うーんおもろい。 でも問題はnewできないんだけどな。少なくともTrackerSingleMarkerクラスなど派生クラスにはデストラクタしかない。コンストラクタは、Trackerにあるのか見てみる。ないな。 TrackerMultiMarkerImpl.hあった。TrackerSingleMarkerImpl.hこっちもあった。 TrackerSingleMarkerImplはTrackerSingleMarkerを継承しているクラスである。 TrackerSingleMarkerImpl(int nWidth=DEF_CAMWIDTH, int nHeight=DEF_CAMHEIGHT); ということなので、引数を2個入れればnewできるっぽい。無理。「こういうのインターフェースクラスっていうんだよ、バカ」って、機械に教えられたので調べる。 http://www.geocities.jp/ky_webid/cpp/language/010.html より "インタフェースクラスは、メンバ変数を持たず、メンバ関数だけで構成されます。 そして、それらのメンバ関数は、宣言だけされていて定義がありません。 定義のないメンバ関数を持っている都合上、インタフェースクラスをインスタンス化することもできません。 一見、何のために存在しているか分からないですが、インタフェースクラスは、継承して使うためにあります。 そして、定義のないメンバ関数達は、オーバーライドして使います。" 結局よくわからなかったけど、こいつのnewするのはだめそうだ。と思いきや。 http://forum.openframeworks.cc/index.php?topic=743.60;wap2 に mTracker = new ARToolKitPlus::TrackerSingleMarkerImpl <6, 6, 12, 1, 10> (mWidth, mHeight); という宣言方法があったので試してみると一応通った。 この数字はいったい何をしているのかきになったので 調べると。 /// TrackerSingleMarkerImpl implements the TrackerSingleMarker interface /** * __PATTERN_SIZE_X describes the pattern image width (16 by default). * __PATTERN_SIZE_Y describes the pattern image height (16 by default). * __PATTERN_SAMPLE_NUM describes the maximum resolution at which a pattern is sampled from the camera image * (64 by default, must a a multiple of __PATTERN_SIZE_X and __PATTERN_SIZE_Y). * __MAX_LOAD_PATTERNS describes the maximum number of pattern files that can be loaded. * __MAX_IMAGE_PATTERNS describes the maximum number of patterns that can be analyzed in a camera image. * Reduce __MAX_LOAD_PATTERNS and __MAX_IMAGE_PATTERNS to reduce memory footprint. */ これはTrackerImplで以下のように使われる。 /// TrackerImpl implements the Tracker interface template <int __PATTERN_SIZE_X, int __PATTERN_SIZE_Y, int __PATTERN_SAMPLE_NUM, int __MAX_LOAD_PATTERNS, int __MAX_IMAGE_PATTERNS> class TrackerImpl : public Tracker { public: enum { PATTERN_WIDTH = __PATTERN_SIZE_X, PATTERN_HEIGHT = __PATTERN_SIZE_Y, PATTERN_SAMPLE_NUM = __PATTERN_SAMPLE_NUM, MAX_LOAD_PATTERNS = __MAX_LOAD_PATTERNS, MAX_IMAGE_PATTERNS = __MAX_IMAGE_PATTERNS, WORK_SIZE = 1024*MAX_IMAGE_PATTERNS, #ifdef SMALL_LUM8_TABLE LUM_TABLE_SIZE = (0xffff >> 6) + 1, #else LUM_TABLE_SIZE = 0xffff + 1, #endif }; -- 一日経って 昨日はノートPCの上にみそ汁をこぼし、頭が真っ白になる。不幸中の幸いにも、データが飛ばなかった。キーボードがショートしているみたいだ。したボタンが効かない。でも壊れるのはいつになるかということで、開発時間の大半をバックアップにとられた。 1行も進展しないまま、三日目になった矢先の事件のため、さすがに精神的にきつくなる。朝起きて、パソコンと向き合い、夜が来る。基本コードをよんでいるだけ。さすがに集中力がなくなり、床につく、、、。頭の中では、こうすれば、、、ああすれば、、、とぐるぐる回っている。 マーカー情報がどうしてもかえってこないのだ。 今日もだめかもしれないな、、、と朝から3時間ほどリサーチを続けると、元ソースが複雑に処理している部分に気づく。文献をあたると、そこまで複雑な条件判定をかけていない。これを外し、coutでコンソールに値を出すと、なんと動きはじめた。確かに何かを認識している動きである。 for(j = 0; j < marker_num; j++){ if(nPattern==marker_info[j].id){ if(k == -1)k = j; else if(marker_info[k].cf < marker_info[j].cf)k = j; } } cfという情報はコンフィデンスもっともらしさを数字で表したもの。 ふー、なんとか動き出した様子である。後はこれをどう取り出すかだなあ。 if(nMarker_info) *nMarker_info = marker_info; このようにmarker_infoと書いてあるのはARMarkerInfoというクラスのオブジェクトなので、nMarker_infoがさしているポインタがさしているポインタ、のなかにその実態があるはず、、、。どこだ?
前回は惨敗。なんでかっていうとOFのフォーラムになんか使えそうな記事を発見 http://forum.openframeworks.cc/index.php?topic=5031.msg25335#msg25335 ofxARToolKitPlusに触ることなく解決しようと思ったが、クラスの継承がよくわかんなくて惨敗。まあ、作品を作る限定的なことなので、ofxARToolkitPlus.cppをいじってしまおうと決断。ラッパーを作るのがめんどくさいけど。 class TrackerSingleMarker : public Tracker とあるので、TrackerSingleMarkerとTrackerMultiMarkerはTrackerクラスを継承しているとわかる。C++のクラスについてよくわかっていないので、勉強する。 http://www.geocities.jp/ky_webid/cpp/language/012.html より "new演算子を使うとメモリの動的確保が行え、delete演算子によって解放することができます。ここで注意して ほしいのですが、newとdeleteは演算子です。mallocやfreeは関数です。この違いには重要な意味があるのです" うーんおもろい。 でも問題はnewできないんだけどな。少なくともTrackerSingleMarkerクラスなど派生クラスにはデストラクタしかない。コンストラクタは、Trackerにあるのか見てみる。ないな。 TrackerMultiMarkerImpl.hあった。TrackerSingleMarkerImpl.hこっちもあった。 TrackerSingleMarkerImplはTrackerSingleMarkerを継承しているクラスである。 TrackerSingleMarkerImpl(int nWidth=DEF_CAMWIDTH, int nHeight=DEF_CAMHEIGHT); ということなので、引数を2個入れればnewできるっぽい。無理。「こういうのインターフェースクラスっていうんだよ、バカ」って、機械に教えられたので調べる。 http://www.geocities.jp/ky_webid/cpp/language/010.html より "インタフェースクラスは、メンバ変数を持たず、メンバ関数だけで構成されます。 そして、それらのメンバ関数は、宣言だけされていて定義がありません。 定義のないメンバ関数を持っている都合上、インタフェースクラスをインスタンス化することもできません。 一見、何のために存在しているか分からないですが、インタフェースクラスは、継承して使うためにあります。 そして、定義のないメンバ関数達は、オーバーライドして使います。" 結局よくわからなかったけど、こいつのnewするのはだめそうだ。と思いきや。 http://forum.openframeworks.cc/index.php?topic=743.60;wap2 に mTracker = new ARToolKitPlus::TrackerSingleMarkerImpl <6, 6, 12, 1, 10> (mWidth, mHeight); という宣言方法があったので試してみると一応通った。 この数字はいったい何をしているのかきになったので 調べると。 /// TrackerSingleMarkerImpl implements the TrackerSingleMarker interface /** * __PATTERN_SIZE_X describes the pattern image width (16 by default). * __PATTERN_SIZE_Y describes the pattern image height (16 by default). * __PATTERN_SAMPLE_NUM describes the maximum resolution at which a pattern is sampled from the camera image * (64 by default, must a a multiple of __PATTERN_SIZE_X and __PATTERN_SIZE_Y). * __MAX_LOAD_PATTERNS describes the maximum number of pattern files that can be loaded. * __MAX_IMAGE_PATTERNS describes the maximum number of patterns that can be analyzed in a camera image. * Reduce __MAX_LOAD_PATTERNS and __MAX_IMAGE_PATTERNS to reduce memory footprint. */ これはTrackerImplで以下のように使われる。 /// TrackerImpl implements the Tracker interface template <int __PATTERN_SIZE_X, int __PATTERN_SIZE_Y, int __PATTERN_SAMPLE_NUM, int __MAX_LOAD_PATTERNS, int __MAX_IMAGE_PATTERNS> class TrackerImpl : public Tracker { public: enum { PATTERN_WIDTH = __PATTERN_SIZE_X, PATTERN_HEIGHT = __PATTERN_SIZE_Y, PATTERN_SAMPLE_NUM = __PATTERN_SAMPLE_NUM, MAX_LOAD_PATTERNS = __MAX_LOAD_PATTERNS, MAX_IMAGE_PATTERNS = __MAX_IMAGE_PATTERNS, WORK_SIZE = 1024*MAX_IMAGE_PATTERNS, #ifdef SMALL_LUM8_TABLE LUM_TABLE_SIZE = (0xffff >> 6) + 1, #else LUM_TABLE_SIZE = 0xffff + 1, #endif }; -- 一日経って 昨日はノートPCの上にみそ汁をこぼし、頭が真っ白になる。不幸中の幸いにも、データが飛ばなかった。キーボードがショートしているみたいだ。したボタンが効かない。でも壊れるのはいつになるかということで、開発時間の大半をバックアップにとられた。 1行も進展しないまま、三日目になった矢先の事件のため、さすがに精神的にきつくなる。朝起きて、パソコンと向き合い、夜が来る。基本コードをよんでいるだけ。さすがに集中力がなくなり、床につく、、、。頭の中では、こうすれば、、、ああすれば、、、とぐるぐる回っている。 マーカー情報がどうしてもかえってこないのだ。 今日もだめかもしれないな、、、と朝から3時間ほどリサーチを続けると、元ソースが複雑に処理している部分に気づく。文献をあたると、そこまで複雑な条件判定をかけていない。これを外し、coutでコンソールに値を出すと、なんと動きはじめた。確かに何かを認識している動きである。 for(j = 0; j < marker_num; j++){ if(nPattern==marker_info[j].id){ if(k == -1)k = j; else if(marker_info[k].cf < marker_info[j].cf)k = j; } } cfという情報はコンフィデンスもっともらしさを数字で表したもの。 ふー、なんとか動き出した様子である。後はこれをどう取り出すかだなあ。 if(nMarker_info) *nMarker_info = marker_info; このようにmarker_infoと書いてあるのはARMarkerInfoというクラスのオブジェクトなので、nMarker_infoがさしているポインタがさしているポインタ、のなかにその実態があるはず、、、。どこだ?

表示オプション

横に並べて表示:
変化行の前後のみ表示: