※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

前回は惨敗。なんでかっていうと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がさしているポインタがさしているポインタ、のなかにその実態があるはず、、、。どこだ?