Visual Studio 2013 Express Visual C++( アンマネージドコード ) OpenCV 3.1 |
■282.OpenCV グレースケール画像から円を検出 | Prev Top Next | |
|
ハフ変換を用いて,グレースケール画像から円を検出します。どうも誤検出が多い。
#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; }元画像
円の検出