超、自分用メモ。
cv::Mat src = cv::imread("streat2.jpg", CV_LOAD_IMAGE_GRAYSCALE); cv::Mat input(src.rows, src.cols, src.type()); // 2値化 cv::threshold(src, input, 200, 255, CV_THRESH_BINARY); // 輪郭を抽出 std::vector<std::vector<cv::Point>> contours; cv::findContours(input, contours, CV_RETR_LIST, CV_CHAIN_APPROX_NONE); // 最大面積の領域をピックアップauto maxContour = std::max_element(contours.begin(), contours.end(), [](std::vector<cv::Point> x, std::vector<cv::Point> y) {return cv::contourArea(x) < cv::contourArea(y); }); // cv::RotatedRectに変換auto area = [maxContour](){ cv::Mat pointf; cv::Mat(*maxContour).convertTo(pointf, CV_32F); return cv::fitEllipse(pointf); }(); // 描画 cv::ellipse(src, area, cv::Scalar(255, 0, 0), 2);
C++のラムダ式はじめて使ったけど便利ですね。STLと相性いいです。