Visual Studio 2013 Express Visual C++( アンマネージドコード ) OpenCV 3.1 |
■272.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)); } } } 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; }