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

■275.OpenCV 点群を上をいい感じにとおる線分を描画 Prev Top Next
関連ページ:

2 次元あるいは 3 次元の点集合に直線をフィッティングするらしい。


---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/37/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::Vec4f line;

      for (int i = 0; i >= 0; i = hierarchy[i][0])
      {
         // 2 次元あるいは 3 次元の点集合に直線をフィッティング
         cv::fitLine(contours[i], line, CV_DIST_L2, 0, 0.01, 0.01);

         // 線分を描画
         cv::line(src,
            cv::Point(line.val[2] - line.val[0] * 20.0, line.val[3] - line.val[1] * 20.0),     // 1つ目の線分の座標
            cv::Point(line.val[2] + line.val[0] * 20.0, line.val[3] + line.val[1] * 20.0),     // 2つ目の線分の座標
            cv::Scalar(0, 0, 255),   // 色
            2,                       // 太さ
            cv::LINE_8
            );
      }

      cv::namedWindow("line", 1);
      cv::imshow("line", 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