2014年6月9日月曜日

OpenCVを使った特徴点抽出

OpenCVには画像から特徴点の抽出および特徴量の抽出を行うためのクラスが用意されている。基本的には、cv::FeatureDetector::create()で利用したい検出器を作成、cv::DescriptorExtractor::create()で特徴量の抽出器を作成する。SIFTやSURFを使う場合はnonfree.hppをインクルードし、cv::initModule_nonfree()で利用前にモジュールを初期化する必要がある。以下、カメラ画像から特徴点抽出および特徴量抽出を行うためのコード。

#include <iostream>
#include <vector>

#include <opencv2/opencv.hpp>
#include <opencv2/nonfree.hpp> //SIFT,SURFを用いる場合に必要

int main(int argc, char** argv)
{
 cv::Mat input;
 cv::VideoCapture cap( 0 ); //ビデオデバイス番号

 if( !cap.isOpened() ) //デバイスのオープンに成功したかどうか
  return -1;

 cv::initModule_nonfree(); //SIFT, SURFを用いる場合にはモジュールを初期化する必要がある
 cv::Ptr<cv::FeatureDetector> detector = cv::FeatureDetector::create( "SURF" ); //検出器を指定(SIFT, SURF, ORBなど)
 cv::Ptr<cv::DescriptorExtractor> descriptorExtractor = cv::DescriptorExtractor::create( "SURF" ); //特徴量を指定(SIFT, SURF, ORBなど )

 if ( detector.empty() ) //検出器の作成に成功したか
 {
  std::cout << "Cannot create detector" << std::endl;
  return -1;
 }
 if ( descriptorExtractor.empty() ) //特徴量の抽出器の作成に成功したか
 {
  std::cout << "Cannot create extractor" << std::endl;
  return -1;
 }

 std::vector<cv::KeyPoint> keypoints;
 cv::Mat descriptors;
 cv::Mat output;

 cv::namedWindow( "Keypoint" );

 while( 1 )
 {
  cap >> input; //画像の取得
  detector->detect(input, keypoints); //特徴点抽出
  descriptorExtractor->compute(input, keypoints, descriptors); //特徴量抽出

  cv::drawKeypoints(input, keypoints, output); //キーポイントの位置に円を描画

  cv::imshow( "Keypoint", output );

  if( cv::waitKey( 30 ) >= 0 )
   break;
 }
 return 0;
}



0 件のコメント:

コメントを投稿