別の最近某探索の記事を書いていたけれど、書き終わらないので一部抜粋(2年前調べ)。
特徴点抽出(数量とバイナリ)
画像の特徴点抽出には様々な種類(SIFT, SURF, FAST, CenSurE, ORB, KAZE, AKAZE...)がある。特徴のある点の座標を抽出するだけの特徴点抽出手法もあれば、多次元の特徴ベクトルを持つ特徴点抽出手法もある。
特徴量表現 | 主な特徴量 |
---|---|
バイナリ・多次元 | ORB, BRISK, BRIEF, FREAK, AKAZE |
浮動小数・多次元 | HOG, SIFT, SURF, GLOH, CenSurE, KAZE |
浮動小数・1次元(位置決定) | Harris, Shi-Tomasi |
特徴量を浮動小数で表現すると情報量が非常に大きくなるため、大規模な探索用途では利用しにくいという欠点がある。例えばN次元の特徴量をfloat(4byte=32bit)で持った場合は32*N[bit]必要だが、バイナリであればN[bit]で一つの特徴を表現することができる。各次元の値の比較は、各ビットを比較して幾つのビットが異なるかを知ることで特徴量の違い(距離)を知ることができる。これをハミング距離と呼ぶ。利用する特徴量がバイナリかそうでないかで距離計算方法が異なるため気をつける必要がある。
OpenCVで提供されているBoWがある(cv2. BOWTrainer, cv2.BOWKMeansTrainer, cv2.BOWImgDescriptorExtractor)が、いずれも浮動小数で表現する特徴量として取り扱う必要がある。近傍探索でcv2.BFMatcherを利用する際に、バイナリで表現する特徴量を利用する場合は引数normTypeとしてcv2.NORM_HAMMINGを指定する必要がある。