特徴点マッチング・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; }
実行するとこうなります。
今回はしきい値を設定したので検出した特徴点は169点とSIFT SURFに比べると少なめでした。