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

■282.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, dst;
      std::vector<cv::Vec3f> circles;

      // 画像読み込み
      src = cv::imread("D:/TEMP/MaverickProj/Image/OpenCV/44/Texture.png", cv::IMREAD_GRAYSCALE);

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

      dst = cv::Mat::zeros(src.rows, src.cols, CV_8UC3);

      // src[0] -> dst[2], src[0] -> dst[1], src[0] -> dst[0]
      // て感じでコピー元インデックスとコピー先インデックスを指定する
      int fromTo[] = { 0, 2, 0, 1, 0, 0 };

      // シングルチャンネルを3チャンネルに増やして、コピーする
      cv::mixChannels(&src, 1, &dst, 1, fromTo, 3);

      cv::HoughCircles(
         src,                    // 8ビット,シングルチャンネル,グレースケールの入力画像
         circles,                // 検出された円を出力.配列の [ 0, 1 ] に円の中心座標. [2] に円の半径が格納される
         cv::HOUGH_GRADIENT,     // cv::HOUGH_GRADIENT メソッドのみ実装されている.
         2,                      // 画像分解能に対する出力解像度の比率の逆数
         30,                     // 検出される円の中心同士の最小距離
         100,                    // Canny() の大きいほうの閾値.勾配がこのパラメータを超えている場合はエッジとして判定
         50                      // Canny() の小さいほうの閾値.勾配がこのパラメータを下回っている場合は非エッジとして判定
         );

      for (auto circle : circles)
      {
         cv::circle(dst, cv::Point( circle[0], circle[1] ), circle[2], cv::Scalar(0, 0, 255), 2);
      }

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

      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