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

■268.OpenCV 輪郭描画 Prev Top Next
関連ページ:

今回はfindContours()で取得した輪郭の点ベクトルを使用して輪郭を描画します。


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

      std::vector<cv::Vec4i> hierarchy;

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

      // あらかじめ領域を確保する
      dst2 = cv::Mat::zeros(src.rows, src.cols, CV_8UC3);

      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,             // 輪郭を点ベクトルとして取得する
         hierarchy,            // hiararchy ? オプション.画像のトポロジーに関する情報を含む出力ベクトル.
         CV_RETR_EXTERNAL,     // 輪郭抽出モード
         CV_CHAIN_APPROX_NONE  // 輪郭の近似手法
         );     

      // hierarchy[i][0] はリスト構造となっていている.
      // インデックス 0 を参照すると次の輪郭のインデックスを取得できる
      for (int i = 0; i >= 0; i = hierarchy[i][0])
      {
         drawContours(dst2,
                      contours,                 // 入力される全輪郭.ここでは findContours() で取得した輪郭を代入する
                      i,                        // 描かれる輪郭を示す.負の場合,すべての輪郭が描画される.
                      cv::Scalar( 255, 0, 0 ),  // 輪郭の色
                      5,                        // 輪郭の太さ.CV_FILLEDの場合輪郭の内側を塗りつぶし.
                      1                         // 線の連結性
                      );
      }

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

      cv::namedWindow("輪郭描画", 1);
      cv::imshow("輪郭描画", dst2);

      cv::waitKey(0);

      hr = 0;
   }

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

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

   return hr;
}

元画像

2値画像

輪郭描画
mode = CV_RETR_EXTERNAL


Prev Top Next
inserted by FC2 system