Visual Studio 2013 Express
 Visual C++( アンマネージドコード )
 OpenCV 3.1

■280.OpenCV 特徴点の強さを取得する Prev Top Next
関連ページ:

コーナーを検出するための、勾配行列の最小の固有値を取得します。要は特徴点の強さを数値化した値を取得するんでしょう。たぶん


---main.cpp---

#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc.hpp>

#pragma comment( lib, "opencv_world300d.lib" )

int main(int argc, const char* argv[])
{
   int hr = -1;

   try
   {
      cv::Mat src, corners, dst;

      // 画像読み込み
      src = cv::imread("D:/TEMP/MaverickProj/Image/OpenCV/42/Texture.png", cv::IMREAD_GRAYSCALE);

      cv::namedWindow("src", 1);
      imshow("src", src);

      dst = cv::Mat::zeros(src.rows, src.cols, CV_8UC3);

      // src[0] -> dst[2], src[0] -> dst[1], src[0] -> dst[0]
      // て感じでコピー元インデックスとコピー先インデックスを指定する
      int fromTo[] = { 0, 2, 0, 1, 0, 0 };

      // シングルチャンネルを3チャンネルに増やして、コピーする
      cv::mixChannels( &src, 1, &dst, 1, fromTo, 3 );

      int blockSize = 3;

      // コーナーを検出するために,勾配行列の最小の固有値を求める
      cv::cornerMinEigenVal(
         src,       // 8ビットまたは浮動小数点型,シングルチャンネルの入力画像
         corners,   // 最小固有値が格納される画像.型は CV_32FC1 で, src と同じサイズ
         blockSize  // 近傍領域のサイズ
         );
      
      for (int i = 0; i < corners.rows; i++)   // 高さ
      {
         for (int j = 0; j < corners.cols; j++)   // 幅
         {
            // ピクセルデータの検出
            float p = corners.at<cv::Vec<float, 1>>(i, j)[0];

            // 特徴点かどうかを適当に判定
            if (p > 0.01f)
            {
               // 特徴点の強さによって半径の大きさを変えて、円を描画する
               cv::circle(dst, cv::Point(j, i), 50.0f * p + 1, cv::Scalar(0, 0, 255), 1);
            }
         }
      }

      cv::namedWindow("dst", 1);
      imshow("dst", dst);

      cv::waitKey(0);

      hr = 0;
   }

   catch (cv::Exception ex)
   {
      std::cout << ex.err << std::endl;
   }

   // ウィンドウの破棄
   cv::destroyAllWindows();

   return hr;
}

元画像

特徴点の強さ


Prev Top Next
inserted by FC2 system