web-dev-qa-db-ja.com

OpenCV ORB検出器が検出するキーポイントはほとんどありません

ORBキーポイント検出器を使用しようとしていますが、SIFT検出器およびFAST検出器よりもはるかに少ないポイントを返すようです。

この画像は、ORB検出器によって検出されたキーポイントを示しています。

enter image description here

この画像は、SIFT検出ステージで検出されたキーポイントを示しています(FASTは同様の数のポイントを返します)。

enter image description here

このような少数のポイントがあると、画像全体で非常に貧弱な特徴照合結果が得られます。私は今のところORBの検出段階に興味がありますが、これは間違った結果が得られているようです。私はORB検出器をデフォルトのパラメーターと以下に詳述するカスタムパラメーターで使用してみました。

なぜそんなに大きな違いがあるのですか?

コード:

orb = cv2.ORB_create(edgeThreshold=15, patchSize=31, nlevels=8, fastThreshold=20, scaleFactor=1.2, WTA_K=2,scoreType=cv2.ORB_HARRIS_SCORE, firstLevel=0, nfeatures=500)
#orb = cv2.ORB_create()
kp2 = orb.detect(img2)
img2_kp = cv2.drawKeypoints(img2, kp2, None, color=(0,255,0), \
        flags=cv2.DrawMatchesFlags_DEFAULT)

plt.figure()
plt.imshow(img2_kp)
plt.show()
12
coderunner

nfeaturesを増やすと、検出されるコーナーの数が増えます。キーポイントエクストラクタの種類は関係ないようです。このパラメーターがFASTまたはHarrisにどのように渡されるかはわかりませんが、動作するようです。

orb = cv2.ORB_create(scoreType=cv2.ORB_FAST_SCORE)

enter image description here

orb = cv2.ORB_create(nfeatures=100000, scoreType=cv2.ORB_FAST_SCORE)

enter image description here

10
iabdalkader

このスレッドはかなり古いですが、これが同じ質問のある人に役立つことを願っています:

このパラメーターがFASTまたはHarrisにどのように渡されるかはわかりませんが、動作するようです。

それはRubleeらによって非常によく説明されています。彼らの論文「ORB:SIFTまたはSURFの効率的な代替手段」。私はそれをよりよく説明できるとは思わないので、ここに「2011 International Computer Conference on Computer Vision」の2565ページからの直接の引用があります:

FASTは角度の測定値を生成せず、エッジに沿って大きな応答があることがわかりました。 FASTキーポイントを注文するには、Harrisコーナーメジャー[11]を使用します。キーポイントのターゲット数Nの場合、最初にN個を超えるキーポイントが得られるようにしきい値を低く設定してから、Harrisメジャーに従ってそれらを順序付け、上位Nポイントを選択します。

2
TangoIndiaMike