From 6f4160c0140c8ef88d777ba2ee5a605bf345de64 Mon Sep 17 00:00:00 2001 From: Alexander Panov Date: Tue, 24 Aug 2021 22:29:40 +0300 Subject: [PATCH] Merge pull request #20584 from AleksandrPanov:fix_HoughCircles_ALT_dimensions Fix hough circles alt dimensions * fix OutputArray _circles dimensions * add houghcircles_alt test * fix warnings * add shape assert * change asserts --- modules/imgproc/src/hough.cpp | 6 ++- modules/python/test/test_houghcircles.py | 47 ++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 2 deletions(-) diff --git a/modules/imgproc/src/hough.cpp b/modules/imgproc/src/hough.cpp index 79f34521e8..5c78c94983 100644 --- a/modules/imgproc/src/hough.cpp +++ b/modules/imgproc/src/hough.cpp @@ -2301,14 +2301,16 @@ static void HoughCircles( InputArray _image, OutputArray _circles, std::vector cw(ncircles); for( i = 0; i < ncircles; i++ ) cw[i] = GetCircle4f(circles[i]); - Mat(cw).copyTo(_circles); + if (ncircles > 0) + Mat(1, (int)ncircles, cv::traits::Type::value, &cw[0]).copyTo(_circles); } else if( type == CV_32FC3 ) { std::vector cwow(ncircles); for( i = 0; i < ncircles; i++ ) cwow[i] = GetCircle(circles[i]); - Mat(cwow).copyTo(_circles); + if (ncircles > 0) + Mat(1, (int)ncircles, cv::traits::Type::value, &cwow[0]).copyTo(_circles); } else CV_Error(Error::StsError, "Internal error"); diff --git a/modules/python/test/test_houghcircles.py b/modules/python/test/test_houghcircles.py index 90cd184139..2cfc6c9d68 100644 --- a/modules/python/test/test_houghcircles.py +++ b/modules/python/test/test_houghcircles.py @@ -80,5 +80,52 @@ class houghcircles_test(NewOpenCVTests): self.assertLess(float(len(circles) - matches_counter) / len(circles), .75) + def test_houghcircles_alt(self): + + fn = "samples/data/board.jpg" + + src = self.get_sample(fn, 1) + img = cv.cvtColor(src, cv.COLOR_BGR2GRAY) + img = cv.medianBlur(img, 5) + + circles = cv.HoughCircles(img, cv.HOUGH_GRADIENT_ALT, 1, 10, np.array([]), 300, 0.9, 1, 30) + + self.assertEqual(circles.shape, (1, 18, 3)) + + circles = circles[0] + + testCircles = [[38, 181, 17.6], + [99.7, 166, 13.12], + [142.7, 160, 13.52], + [223.6, 110, 8.62], + [79.1, 206.7, 8.62], + [47.5, 351.6, 11.64], + [189.5, 354.4, 11.64], + [189.8, 298.9, 10.64], + [189.5, 252.4, 14.62], + [252.5, 393.4, 15.62], + [602.9, 467.5, 11.42], + [222, 210.4, 9.12], + [263.1, 216.7, 9.12], + [359.8, 222.6, 9.12], + [518.9, 120.9, 9.12], + [413.8, 113.4, 9.12], + [489, 127.2, 9.12], + [448.4, 121.3, 9.12], + [384.6, 128.9, 8.62]] + + matches_counter = 0 + + for i in range(len(testCircles)): + for j in range(len(circles)): + + tstCircle = circleApproximation(testCircles[i]) + circle = circleApproximation(circles[j]) + if convContoursIntersectiponRate(tstCircle, circle) > 0.6: + matches_counter += 1 + + self.assertGreater(float(matches_counter) / len(testCircles), .5) + self.assertLess(float(len(circles) - matches_counter) / len(circles), .75) + if __name__ == '__main__': NewOpenCVTests.bootstrap()