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

■271.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));
            }
         }
      }

      cv::Point2f center;
      float radius;

      // 与えられた 2 次元点集合を囲む最小の円を取得
      cv::minEnclosingCircle(points, center, radius);

      std::cout << "center = " << center.x << ":" << center.y << std::endl;
      std::cout << "radius = " << radius << std::endl;

      // 円描画
      cv::circle(src,
         center, 
         radius,
         cv::Scalar(128, 0, 0), 
         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