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

■285.OpenCV コーナー検出のための特徴マップの出力 Prev Top Next
関連ページ:

コーナー検出のための特徴マップを作成します。 cv::preCornerDetect() で作成される特徴点は目立たないため cv::dilate() を使用して特徴点を膨張します。


---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, edge, dst, dst2;

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

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

      // 画像領域確保
      edge = cv::Mat::zeros(src.rows, src.cols, CV_8UC3);

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

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

      // コーナー検出のための特徴マップを出力
      cv::preCornerDetect(
         src,          // 8ビットまたは浮動小数点型,シングルチャンネルの入力画像
         dst,          // CV_32F で src と同じサイズの出力画像
         5             // アパーチャサイズ
         );

      // 画像を膨張する
      cv::dilate(dst, dst2, cv::Mat(), cv::Point(-1, -1), 1);

      // 検出されたエッジをもとに赤で塗りつぶす
      for (int i = 0; i < dst2.rows; i++)   // 高さ
      {
         for (int j = 0; j < dst2.cols; j++)   // 幅
         {
            if (dst2.at<cv::Vec<float, 1>>(i, j)[0] > 0.01)
            {
               edge.at<cv::Vec3b>(i, j)[2] = 255;
            }
         }
      }

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

      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