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

■290.OpenCV MSER 抽出アルゴリズムによる領域検出 Prev Top Next
関連ページ:

MSER 抽出アルゴリズムを使用して領域検出します


---main.cpp---

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

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

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

   try
   {
      cv::Mat src, dst_point, dst_rect;
      std::vector<std::vector<cv::Point>> points;
      std::vector<cv::Rect> rects;

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

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

      dst_point = cv::Mat::zeros(src.rows, src.cols, CV_8UC3);
      dst_rect = 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_point, 1, fromTo, 3);
      cv::mixChannels(&src, 1, &dst_rect, 1, fromTo, 3);

      // Maximally-Stable Extremal Region 抽出器.
      cv::Ptr<cv::MSER> mser = cv::MSER::create();

      mser->detectRegions(src, points, rects);

      int cnt = 0;
      for (auto point : points)
      {
         // 大きい領域は除外する
         if (point.size() < 200)
         {
            for ( auto point2 : point )
            {
               // 点の描画
               cv::circle(dst_point, point2, 1, cv::Scalar(0, 0, 255), 1);
            }
         }
      }

      cv::namedWindow("MSER Point", 1);
      imshow("MSER Point", dst_point);

      for (auto rect : rects)
      {
         // 大きい領域は除外する
         if (rect.width < 40 && rect.height < 40)
         {
            // 矩形の描画
            cv::rectangle(dst_rect, rect, cv::Scalar(0, 0, 255), 1);
         }
      }

      cv::namedWindow("MSER Rect", 1);
      imshow("MSER Rect", dst_rect);

      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