最近、画像処理したりすることもなくはないので、勉強のためにSIFT特徴量を抽出するプログラムを作ってみました。
C++とOpenCVで書いています。Visual Studio利用で、今回はOpenCVの環境構築とかについては書かず、さらっとコードと結果だけ載せて、誰かにとって有益な情報になればよいなくらいのスタンスでいきます。
ざくっと説明します(実はよくわかっていない)。
SIFTは画像の特徴量としてはメジャーなものの一つで、Scale-Invariant Feature Transformの頭文字を取ったものです。
論文的には、以下の二つが該当するようですが、個人的には②を読めば十分かなという次第です。
① 「Object Recognition from Local Scale-Invariant Features」
② 「Distinctive Image Features from Scale-Invariant Keypoints」
どちらもUniversity of British ColumbiaのDavid G. Lowe氏の論文で、有名な論文なので検索したら必ず出てきます。
回転や拡大・縮小に不変な特徴量で、照明等の影響にも頑健な特徴量です。詳しいアルゴリズムは他のサイトや、論文に譲って、OpenCVでの実装プログラムと実装結果を示していきましょう。
・OS : Windows10(64bit)
・GPU: GeForce GTX 950
・OpenCV 2.4.13
・Visual Studio Community 2015
Visual StudioのプロジェクトはGithubにアップしときました。
SIFT特徴量のための関数がOpenCVには整備されているので、割と簡単に抽出できますね。
「input.jpg」を以下の画像にして、入力しました。
「output_image_1.png」が以下、
「output_image_2.png」が以下です。
表示方法を変えているだけで、出している特徴量は同じものとなります。
エッジ部分を中心に特徴量が現れているのがわかると思います。
何に使うの? という話ではあるんですが、現在割とノープランです。
取りあえず、画像処理とかをやり始めた身としては知っておいた方が良いかなと思い作ってみました。
時間があれば他の特徴量についても試してみたいですね。