BE CREATIVE

OpenCVよりな理系大学生による主に研究ブログ(個人用) - Egocentric Vision・SURF・SIFT・Optical Flow・AR・ Motion Analyses・Kinect・Leap Motion - 最近、VCでアルバイト始めました。

特徴点マッチング・FAST

前回、SIFT SURFを使って特徴点を検出、特徴量を記述し比較画像とマッチングを行いましたが
今回は特徴点の検出をFASTで行いました。
基本的なソースは前回と同様です。

#include "fast_matching.h"
#include <iostream>
#include <opencv/cv.h>
#include <opencv2/opencv.hpp>
#include <opencv/highgui.h>
#include <opencv/cxcore.h>
#include <ctype.h>
#include <stdio.h>
#include <opencv2/nonfree/nonfree.hpp>
#include <opencv2/nonfree/features2d.hpp>
#include <opencv2/legacy/legacy.hpp>  


int
main(int argc, char *argv[])
{
    
    //画像読み込み
    cv::Mat colorImg1 = cv::imread("/image/lena2.png");
    cv::Mat colorImg2 = cv::imread("/image/lena3.png");
    if(colorImg1.empty() || colorImg2.empty()){
        std::cout << "No Image" << std::endl;
        return -1;
    }

    //特徴点抽出用のグレー画像用意
    cv::Mat grayImg1, grayImg2;
    cv::cvtColor(colorImg1, grayImg1, CV_BGR2GRAY);
    cv::normalize(grayImg1, grayImg1, 0, 255, cv::NORM_MINMAX);
    cv::cvtColor(colorImg2, grayImg2, CV_BGR2GRAY);
    cv::normalize(grayImg2, grayImg2, 0, 255, cv::NORM_MINMAX);
    
    // FAST 検出器に基づく特徴点検出
    // threashld=70, nonMaxSuppression=true
    cv::FastFeatureDetector detector(70, false);
    cv::SiftDescriptorExtractor extractor;

    //------------ 処理時間計測 開始 --------------
    double ticFrequency;    // 1マイクロ秒あたりのTick数
    double processTime;     // 実行時間
    int    startTic;        // 開始
    int    stopTic;         // 終了時間
    // 1マイクロ秒あたりのTick数を得ます。最初に1回だけ実行すればよいです。
    ticFrequency = cvGetTickFrequency();
    // 計測開始点でのTick数を得ます。
    startTic = (int)cvGetTickCount();
    
    //-------------------------------------------
    
    //画像から特徴点を検出
    std::vector<cv::KeyPoint> keypoints1;
    detector.detect(grayImg1, keypoints1);
    std::cout << "Detected " << (int) keypoints1.size() << " keypoints1" <<std::endl;   //特徴点算出
    std::vector<cv::KeyPoint> keypoints2;
    detector.detect(grayImg2, keypoints2);
    std::cout << "Detected " << (int) keypoints2.size() << " keypoints2" <<std::endl;   //特徴点算出
    
    cv::Mat descriptors1;
    extractor.compute(grayImg1, keypoints1, descriptors1);
    cv::Mat descriptors2;
    extractor.compute(grayImg2, keypoints2, descriptors2);
    
    //特徴点の対応付け
    std::vector<cv::DMatch> matches;
    cv::BruteForceMatcher<cv::L2<float> > matcher;
    matcher.match(descriptors1, descriptors2, matches);
    std::cout << "Matching " << (int) matches.size() << " matching" <<std::endl;   //特徴点算出
    
    //ソートしたn番目までの対応線を表示させる。nth_elementは要素を基準要素よりも手前に移動させるある種のソート
    int N=50;
    nth_element(matches.begin(), matches.begin()+N-1, matches.end());
    matches.erase(matches.begin()+N, matches.end());
    
    //------------ 処理時間計測 終了 --------------
    
    // 計測終了点でのTick数を得ます。
    stopTic = (int)cvGetTickCount();
    // 実行時間を計算します。単位はマイクロ秒であることに注意してください。
    processTime = (stopTic-startTic)/ticFrequency;
    printf("%f",processTime);
    
    //------------------------------------------
    
    cv::Mat matchedImg;
    cv::drawMatches(colorImg1, keypoints1, colorImg2, keypoints2, matches, matchedImg);
    
    cv::namedWindow("FAST", CV_WINDOW_AUTOSIZE|CV_WINDOW_FREERATIO);
    cv::imshow("FAST", matchedImg);
    cv::waitKey(0);
    return 0;

}


実行するとこうなります。
f:id:junn511:20140713152715p:plain


今回はしきい値を設定したので検出した特徴点は169点とSIFT SURFに比べると少なめでした。