Visual Studio 2013 Express Visual C++( アンマネージドコード ) OpenCV 3.1 |
■271.OpenCV 点群を囲む最小の円を描画 | Prev Top Next | |
|
図形を描画します。
#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; }