From cec641fb831c85975d322de519fe0ec101aba53b Mon Sep 17 00:00:00 2001 From: Alexander Reshetnikov Date: Fri, 20 Jan 2012 16:21:27 +0000 Subject: [PATCH] completed test for boundingRect function --- modules/imgproc/test/test_boundingrect.cpp | 84 ++++++++++++++++++++++++++---- 1 file changed, 75 insertions(+), 9 deletions(-) diff --git a/modules/imgproc/test/test_boundingrect.cpp b/modules/imgproc/test/test_boundingrect.cpp index d150a89..cf29d2e 100644 --- a/modules/imgproc/test/test_boundingrect.cpp +++ b/modules/imgproc/test/test_boundingrect.cpp @@ -1,5 +1,10 @@ #include "test_precomp.hpp" #include +#include + +#define IMGPROC_BOUNDINGRECT_ERROR_DIFF 1 + +#define MESSAGE_ERROR_DIFF "Bounding rectangle found by boundingRect function is incorrect." using namespace cv; using namespace std; @@ -14,25 +19,86 @@ class CV_BoundingRectTest: public cvtest::ArrayTest void run (int); private: - + template void generate_src_points(vector >& src, int n); + template cv::Rect get_bounding_rect(const vector > src); + template bool checking_function_work(vector >& src, int type); }; CV_BoundingRectTest::CV_BoundingRectTest() {} CV_BoundingRectTest::~CV_BoundingRectTest() {} -void CV_BoundingRectTest::run(int) +template void CV_BoundingRectTest::generate_src_points(vector >& src, int n) +{ + src.clear(); + for (size_t i = 0; i < n; ++i) + src.push_back(Point_(cv::randu(), cv::randu())); +} + +template cv::Rect CV_BoundingRectTest::get_bounding_rect(const vector > src) { - const int MAX_WIDTH = 100; - const int MAX_HEIGHT = 100; - const int N = 100; + int n = src.size(); + T min_w = std::numeric_limits::max(), max_w = std::numeric_limits::min(); + T min_h = min_w, max_h = max_w; + + for (size_t i = 0; i < n; ++i) + { + min_w = std::min(src.at(i).x, min_w); + max_w = std::max(src.at(i).x, max_w); + min_h = std::min(src.at(i).y, min_h); + max_h = std::max(src.at(i).y, max_h); + } + + return Rect((int)min_w, (int)min_h, (int)(floor(1.0*(max_w-min_w)) + 1), (int)(floor(1.0*(max_h-min_h)) + 1)); +} - RNG& rng = ts->get_rng(); +template bool CV_BoundingRectTest::checking_function_work(vector >& src, int type) +{ + const int MAX_COUNT_OF_POINTS = 1000; + const int N = 10000; - for (size_t i = 0; i < N; ++i) + for (int k = 0; k < N; ++k) { - int w = rng.next()%MAX_WIDTH + 1, h = rng.next()%MAX_HEIGHT + 1; - cv::Mat src(h, w, CV_8U); cv::randu(src, Scalar_::all(false), Scalar_::all(true)); + + RNG& rng = ts->get_rng(); + + int n = rng.next()%MAX_COUNT_OF_POINTS + 1; + + generate_src_points (src, n); + + cv::Rect right = get_bounding_rect (src); + + cv::Rect rect[2] = { boundingRect(src), boundingRect(Mat(src)) }; + + for (int i = 0; i < 2; ++i) if (rect[i] != right) + { + cout << endl; cout << "Checking for the work of boundingRect function..." << endl; + cout << "Type of src points: "; + switch (type) + { + case 0: {cout << "INT"; break;} + case 1: {cout << "FLOAT"; break;} + case 2: {cout << "DOUBLE"; break;} + default: break; + } + cout << endl; + cout << "Src points are stored as "; if (i == 0) cout << "VECTOR" << endl; else cout << "MAT" << endl; + cout << "Number of points: " << n << endl; + cout << "Right rect (x, y, w, h): [" << right.x << ", " << right.y << ", " << right.width << ", " << right.height << "]" << endl; + cout << "Result rect (x, y, w, h): [" << rect[i].x << ", " << rect[i].y << ", " << rect[i].width << ", " << rect[i].height << "]" << endl; + cout << endl; + CV_Error(IMGPROC_BOUNDINGRECT_ERROR_DIFF, MESSAGE_ERROR_DIFF); + return false; + } + } + + return true; +} + +void CV_BoundingRectTest::run(int) +{ + vector src_veci; if (!checking_function_work(src_veci, 0)) return; + vector src_vecf; checking_function_work(src_vecf, 1); } TEST (Imgproc_BoundingRect, accuracy) { CV_BoundingRectTest test; test.safe_run(); } \ No newline at end of file -- 2.7.4