diff --git a/modules/imgproc/perf/perf_contours.cpp b/modules/imgproc/perf/perf_contours.cpp new file mode 100644 index 0000000000..7606605cce --- /dev/null +++ b/modules/imgproc/perf/perf_contours.cpp @@ -0,0 +1,87 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. +#include "perf_precomp.hpp" + +namespace opencv_test { + +CV_ENUM(RetrMode, RETR_EXTERNAL, RETR_LIST, RETR_CCOMP, RETR_TREE) +CV_ENUM(ApproxMode, CHAIN_APPROX_NONE, CHAIN_APPROX_SIMPLE, CHAIN_APPROX_TC89_L1, CHAIN_APPROX_TC89_KCOS) + +typedef TestBaseWithParam< tuple > TestFindContours; + +PERF_TEST_P(TestFindContours, findContours, + Combine( + Values( szVGA, sz1080p ), // image size + RetrMode::all(), // retrieval mode + ApproxMode::all(), // approximation method + Values( 32, 128 ) // blob count + ) + ) +{ + Size img_size = get<0>(GetParam()); + int retr_mode = get<1>(GetParam()); + int approx_method = get<2>(GetParam()); + int blob_count = get<3>(GetParam()); + + RNG rng; + Mat img = Mat::zeros(img_size, CV_8UC1); + for(int i = 0; i < blob_count; i++ ) + { + Point center; + center.x = (unsigned)rng % (img.cols-2); + center.y = (unsigned)rng % (img.rows-2); + Size axes; + axes.width = ((unsigned)rng % 49 + 2)/2; + axes.height = ((unsigned)rng % 49 + 2)/2; + double angle = (unsigned)rng % 180; + int brightness = (unsigned)rng % 2; + + // keep the border clear + ellipse( img(Rect(1,1,img.cols-2,img.rows-2)), Point(center), Size(axes), angle, 0., 360., Scalar(brightness), -1); + } + vector< vector > contours; + + TEST_CYCLE() findContours( img, contours, retr_mode, approx_method ); + + SANITY_CHECK_NOTHING(); +} + +typedef TestBaseWithParam< tuple > TestFindContoursFF; + +PERF_TEST_P(TestFindContoursFF, findContours, + Combine( + Values(szVGA, sz1080p), // image size + ApproxMode::all(), // approximation method + Values(32, 128) // blob count + ) +) +{ + Size img_size = get<0>(GetParam()); + int approx_method = get<1>(GetParam()); + int blob_count = get<2>(GetParam()); + + RNG rng; + Mat img = Mat::zeros(img_size, CV_32SC1); + for (int i = 0; i < blob_count; i++) + { + Point center; + center.x = (unsigned)rng % (img.cols - 2); + center.y = (unsigned)rng % (img.rows - 2); + Size axes; + axes.width = ((unsigned)rng % 49 + 2) / 2; + axes.height = ((unsigned)rng % 49 + 2) / 2; + double angle = (unsigned)rng % 180; + int brightness = (unsigned)rng % 2; + + // keep the border clear + ellipse(img(Rect(1, 1, img.cols - 2, img.rows - 2)), Point(center), Size(axes), angle, 0., 360., Scalar(brightness), -1); + } + vector< vector > contours; + + TEST_CYCLE() findContours(img, contours, RETR_FLOODFILL, approx_method); + + SANITY_CHECK_NOTHING(); +} + +} // namespace