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

■274.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;
      std::vector<std::vector<cv::Point>> contours;
      std::vector<cv::Vec4i> hierarchy;

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

      // 前景、背景領域分離
      cv::grabCut(src,                 // 8ビット,3チャンネルの入力画像.
         mask,                         // 8ビット,シングルチャンネルの入出力マスク.
         cv::Rect(80, 170, 360, 60),   // 前景かもしれない矩形領域
         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値画像中の輪郭を検出
      cv::findContours(dst,    // 入力画像,8ビット,シングルチャンネル.0以外のピクセルは 1 、0のピクセルは0として扱う。処理結果として image を書き換えることに注意する.
         contours,             // 輪郭を点ベクトルとして取得する
         hierarchy,            // hiararchy ? オプション.画像のトポロジーに関する情報を含む出力ベクトル.
         CV_RETR_EXTERNAL,     // 輪郭抽出モード
         CV_CHAIN_APPROX_NONE  // 輪郭の近似手法
         );

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

      cv::Mat points;
      for (int i = 0; i >= 0; i = hierarchy[i][0])
      {
         // 2 次元の点集合にフィッティングする楕円を取得
         cv::RotatedRect rc = cv::fitEllipse(contours[i]);

         // 楕円を描画
         cv::ellipse(src, rc, cv::Scalar(0, 128, 0), 1, CV_AA);
      }

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

      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