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

■262.OpenCV 塗りつぶし Prev Top Next
関連ページ:

今回はマウスクリックしたピクセルとその連結部分、つまり色の差が許容範囲内の色を塗りつぶします。


---main.cpp---

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

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

void onMouse(int event, int x, int y, int flags, void* param)
{
   cv::Mat* dst = (cv::Mat* )param;
   int ret;

   switch (event)
   {
   case CV_EVENT_LBUTTONDOWN:   // 左ボタンが押された
      // 指定された色で連結成分を塗りつぶす( マスクは使用しない )
      ret = cv::floodFill(*dst, 
                          cv::Point(x, y),  // 指定した座標を塗りつぶしの開始地点
                          cv::Scalar(128),  // 塗りつぶす色
                          nullptr,
                          cv::Scalar(10) , // 輝度値/色の差の許容下限値.この範囲内のピクセルを塗りつぶす. 
                          cv::Scalar(10),  // 輝度値/色の差の許容上限値.この範囲内のピクセルを塗りつぶす. 
                          4 | cv::FLOODFILL_FIXED_RANGE  // 4近傍 | これが指定されている場合,現在のピクセルとシードピクセルとの間の差だけが考慮されます
                          );
      // 2値化画像をウィンドウに表示
      imshow("塗りつぶし", *dst);
      break;
   }
}

int main(int argc, const char* argv[])
{
   int hr = -1;
   
   try
   {
      cv::Mat src, dst;

      // 8ビット,シングルチャンネルの入力画像のためグレースケールで読み込む
      src = cv::imread("D:/TEMP/MaverickProj/Image/OpenCV/24/Texture.png", cv::IMREAD_GRAYSCALE);

      // 2値化
      cv::adaptiveThreshold(src,                              // 8ビット,シングルチャンネルの入力画像.
                            dst,
                            255,                              // 2値化画像を作成する際の0以外の色。
                            cv::ADAPTIVE_THRESH_GAUSSIAN_C,   // 近傍の平均値を計算する際に使用するアルゴリズム.ADAPTIVE_THRESH_MEAN_C または ADAPTIVE_THRESH_GAUSSIAN_C.
                            cv::THRESH_BINARY,                // 閾値の種類. THRESH_BINARY または THRESH_BINARY_INV のどちらか.
                            7,                                // ピクセルの閾値を求めるために利用される近傍領域のサイズ.3, 5, 7, など.
                            2                                 // 平均または加重平均から引かれる定数.この値により maxValue となる色の範囲が変わる.
                            );

      // 元画像表示用のウィンドウ作成
      cv::namedWindow("Source", 1);
      // 元画像をウィンドウに表示
      imshow("Source", src);

      // 2値化画像表示用のウィンドウ作成
      cv::namedWindow("塗りつぶし", 1);

      // マウスイベント
      cv::setMouseCallback("塗りつぶし", onMouse, (void*)&dst);

      // 2値化画像をウィンドウに表示
      imshow("塗りつぶし", dst);

      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