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

■267.OpenCV 2値画像中の輪郭抽出 Prev Top Next
関連ページ:

2値画像中の輪郭を抽出します。今回使用する関数は、輪郭を点ベクトルとして取得できることがポイントとなります。


---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, dst;
      std::vector<std::vector<cv::Point>> contours;


      src = cv::imread("D:/TEMP/MaverickProj/Image/OpenCV/29/Texture.png", cv::IMREAD_GRAYSCALE);

      cv::threshold(src,                // 入力配列(シングルチャンネル,8ビット,あるいは32ビット浮動小数点型).
                    dst,
                    200,                // 閾値.
                    255,                // 閾値処理の種類が THRESH_BINARY や THRESH_BINARY_INV の場合に利用される,最大値の値.
                    cv::THRESH_BINARY   // 閾値処理の種類._INVを指定すると階調反転
                    );

      cv::namedWindow("2値画像", 1);
      cv::imshow("2値画像", dst);
      
      // 2値画像中の輪郭を検出
      findContours(dst,   // 入力画像,8ビット,シングルチャンネル.0以外のピクセルは 1 、0のピクセルは0として扱う。処理結果として image を書き換えることに注意する.
                   contours,             // 輪郭を点ベクトルとして取得する
                   CV_RETR_EXTERNAL,     // 輪郭抽出モード
                   CV_CHAIN_APPROX_NONE  // 輪郭の近似手法
                  );

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

      cv::namedWindow("輪郭抽出", 1);
      cv::imshow("輪郭抽出", dst);

      cv::waitKey(0);

      hr = 0;
   }

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

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

   return hr;
}

元画像

2値画像

輪郭抽出
mode = CV_RETR_EXTERNAL

輪郭抽出
mode = CV_RETR_LIST

輪郭抽出
mode = CV_RETR_CCOMP

輪郭抽出
mode = CV_RETR_TREE


Prev Top Next
inserted by FC2 system