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

■266.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, mul;

      src = cv::imread("D:/TEMP/MaverickProj/Image/OpenCV/28/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        // 一致しているピクセルを取得
                  );

      // 積算合成するため3チャンネルに増やす
      dst2 = cv::Mat(dst.rows, dst.cols, CV_8UC3);
      int from_to[] = { 0, 2, 0, 1, 0, 0 };
      cv::mixChannels(&dst, 1, &dst2, 1, from_to, 3);

      // チャンネル数チェック
      std::cout << "channels => " << src.channels() << ":" << dst2.channels() << std::endl;

      // [ 0 - 1 ]に変換して積算合成
      cv::multiply(src, dst2 / 255.0, mul);

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

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

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

      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