さて,局所特徴量のSURFと言うと64次元だよね!という認識が一般的だと思います.
実際には原著(*1)の段階から特徴量を128次元で記述する拡張ディスクリプタ(extended descriptor)についても言及されていて,OpenCVの実装ではSURF特徴記述を行うcv::SurfDescriptorExtractorにおいてデフォルトで有効となっています.
cv::SurfDescriptorExtractor extractor; std::cout << extractor.descriptorSize() << std::endl; //128と出力されます
本来の64次元で使うには,特徴記述処理を行う前にこれを無効にします.
SurfDescriptorExtractorのコンストラクタのextendedをfalseにすればおkなんですが,
ぐぐって見つかるリファレンスでは最新のバージョンに同期されてなくて,でもコンパイルは通るので一瞬困惑します.
コンストラクタで指定するよりは,
cv::SurfDescriptorExtractor extractor; extractor.extended = false; std::cout << extractor.descriptorSize() << std::endl; //64と出力されます
とすれば,その他のコンストラクタの他のデフォルトはそのままにいけます.少し汚いですが.
*1: H.Bay et. al., “Speeded-Up Robust Features (SURF),” ECCV2006