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

■277.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, mask, bgdmodel, fgdmodel, dst, dst2;
      std::vector<std::vector<cv::Point>> contours;
      std::vector<cv::Vec4i> hierarchy;

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

      // 前景、背景領域分離
      cv::grabCut(src,                 // 8ビット,3チャンネルの入力画像.
         mask,                         // 8ビット,シングルチャンネルの入出力マスク.
         cv::Rect(50, 6, 180, 174),    // 前景かもしれない矩形領域
         bgdmodel,                     // 一時領域
         fgdmodel,                     // 一時領域
         3,                            // アルゴリズムの反復回数
         cv::GC_INIT_WITH_RECT         // 処理モード.GC_INIT_WITH_RECT の場合rectを使用してmaskを初期化する
         );

      // 前景かもしれないピクセルを抽出
      cv::compare(mask,
         cv::GC_PR_FGD,    // 前景かもしれないピクセル
         dst,
         cv::CMP_EQ        // 一致しているピクセルを取得
         );

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

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

      for (int i = 0; i < dst2.rows; i++)   // 高さ
      {
         for (int j = 0; j < dst2.cols; j++)   // 幅
         {
            // 点と輪郭の関係を調べる
            
            // measureDist = false の場合は,戻り値はそれぞれ + 1, -1, 0 になる
            // そうでない場合は,点と最も近い輪郭辺までの符号付き距離が戻り値となる
            double d = cv::pointPolygonTest(contours[0], cv::Point2f(j, i), true);

            // std::cout << d << std::endl;
            
            if (d < 0)
            {
               dst2.at<cv::Vec3b>(i, j)[0] = 255 + (uchar)(d * 3);
            }
            else if (d > 0)
            {
               dst2.at<cv::Vec3b>(i, j)[2] = 255 - (uchar)(d * 3);
            }
            else
            {
               dst2.at<cv::Vec3b>(i, j)[1] = 255;
            }
         }
      }

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

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

      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