diff --git a/modules/imgproc/perf/perf_houghLines.cpp b/modules/imgproc/perf/perf_houghLines.cpp index a6ab50e644..96575eca53 100644 --- a/modules/imgproc/perf/perf_houghLines.cpp +++ b/modules/imgproc/perf/perf_houghLines.cpp @@ -8,7 +8,7 @@ using namespace perf; using std::tr1::make_tuple; using std::tr1::get; -typedef std::tr1::tuple Image_RhoStep_ThetaStep_Threshold_t; +typedef std::tr1::tuple Image_RhoStep_ThetaStep_Threshold_t; typedef perf::TestBaseWithParam Image_RhoStep_ThetaStep_Threshold; PERF_TEST_P(Image_RhoStep_ThetaStep_Threshold, HoughLines, @@ -16,30 +16,58 @@ PERF_TEST_P(Image_RhoStep_ThetaStep_Threshold, HoughLines, testing::Values( "cv/shared/pic5.png", "stitching/a1.png" ), testing::Values( 1, 10 ), testing::Values( 0.01, 0.1 ), - testing::Values( 300, 500 ) + testing::Values( 0.5, 1.1 ) ) ) { string filename = getDataPath(get<0>(GetParam())); double rhoStep = get<1>(GetParam()); double thetaStep = get<2>(GetParam()); - int threshold = get<3>(GetParam()); + double threshold_ratio = get<3>(GetParam()); Mat image = imread(filename, IMREAD_GRAYSCALE); if (image.empty()) FAIL() << "Unable to load source image" << filename; - Canny(image, image, 0, 0); + Canny(image, image, 32, 128); - Mat lines; + // add some syntetic lines: + line(image, Point(0, 0), Point(image.cols, image.rows), Scalar::all(255), 3); + line(image, Point(image.cols, 0), Point(image.cols/2, image.rows), Scalar::all(255), 3); + + vector lines; declare.time(60); + int threshold = (int)(std::min(image.cols, image.rows) * threshold_ratio); + TEST_CYCLE() HoughLines(image, lines, rhoStep, thetaStep, threshold); - transpose(lines, lines); -#if (0 && defined(HAVE_IPP) && IPP_VERSION_X100 >= 810) - SANITY_CHECK_NOTHING(); -#else - SANITY_CHECK(lines); + printf("%dx%d: %d lines\n", image.cols, image.rows, (int)lines.size()); + + if (threshold_ratio < 1.0) + { + EXPECT_GE(lines.size(), 2u); + } + + EXPECT_LT(lines.size(), 3000u); + +#if 0 + cv::cvtColor(image,image,cv::COLOR_GRAY2BGR); + for( size_t i = 0; i < lines.size(); i++ ) + { + float rho = lines[i][0], theta = lines[i][1]; + Point pt1, pt2; + double a = cos(theta), b = sin(theta); + double x0 = a*rho, y0 = b*rho; + pt1.x = cvRound(x0 + 1000*(-b)); + pt1.y = cvRound(y0 + 1000*(a)); + pt2.x = cvRound(x0 - 1000*(-b)); + pt2.y = cvRound(y0 - 1000*(a)); + line(image, pt1, pt2, Scalar(0,0,255), 1, cv::LINE_AA); + } + cv::imshow("result", image); + cv::waitKey(); #endif + + SANITY_CHECK_NOTHING(); }