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

■272.OpenCV 点群を内包する凸包を描画 Prev Top Next
関連ページ:

点群を内包する凸包を描画します。


---main.cpp---

#include <time.h>
#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;

      // 画像領域を確保
      src = cv::Mat::zeros(cvSize(512, 384), CV_8UC1);

      // 点の座標領域を確保
      std::vector<cv::Point> points;

      srand((unsigned)time(nullptr));

      for (int i = src.rows * 0.25; i < src.rows * 0.75; i++)
      {
         for (int j = src.cols * 0.25; j < src.cols * 0.75; j++)
         {
            // 画像の中心から各ピクセルまでの距離
            // 0除算で実行時エラーにならないようにするため + 1
            double len = sqrt(pow(src.rows * 0.5 - i, 2) + pow(src.cols * 0.5 - j, 2)) * 10.0 + 1;

            // 点を描画するかを乱数で判定
            if (rand() % (int)len == 0)
            {
               // 点を描画
               cv::circle(src, cv::Point(j, i), 2, cv::Scalar(255), -1, cv::LINE_AA);

               // 点を描画した座標を格納
               points.push_back(cv::Point(j, i));
            }
         }
      }

      std::vector<cv::Point> hull;

      // 点集合に対する凸包を取得
      cv::convexHull(points, hull, true);

      // 枠線描画
      for (int i = 0; i < hull.size(); i++)
      {
         cv::line(src,
            hull[i],
            hull[i + 1 < hull.size() ? i + 1 : 0],
            cv::Scalar(128),
            1,
            cv::LINE_8
            );
      }

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