Merge pull request #27389 from MaximSmolskiy:add_HoughCirclesWithAccumulator_binding

Add HoughCirclesWithAccumulator binding #27389

### Pull Request Readiness Checklist

Fix #27377 

See details at https://github.com/opencv/opencv/wiki/How_to_contribute#making-a-good-pull-request

- [x] I agree to contribute to the project under Apache 2 License.
- [x] To the best of my knowledge, the proposed patch is not based on a code under GPL or another license that is incompatible with OpenCV
- [x] The PR is proposed to the proper branch
- [x] There is a reference to the original bug report and related work
- [x] There is accuracy test, performance test and test data in opencv_extra repository, if applicable
      Patch to opencv_extra has the same branch name.
- [x] The feature is well documented and sample code can be built with the project CMake
This commit is contained in:
Maxim Smolskiy 2025-06-02 10:23:17 +03:00 committed by GitHub
parent a39f61b6e1
commit e92cfb35f6
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 49 additions and 0 deletions

View File

@ -30,6 +30,25 @@ void HoughLinesWithAccumulator(
Mat(lines_acc).copyTo(lines);
}
/** @brief Finds circles in a grayscale image using the Hough transform and get accumulator.
*
* @note This function is for bindings use only. Use original function in C++ code
*
* @sa HoughCircles
*/
CV_WRAP static inline
void HoughCirclesWithAccumulator(
InputArray image, OutputArray circles,
int method, double dp, double minDist,
double param1 = 100, double param2 = 100,
int minRadius = 0, int maxRadius = 0
)
{
std::vector<Vec4f> circles_acc;
HoughCircles(image, circles_acc, method, dp, minDist, param1, param2, minRadius, maxRadius);
Mat(1, static_cast<int>(circles_acc.size()), CV_32FC4, &circles_acc.front()).copyTo(circles);
}
} // namespace
#endif // OPENCV_IMGPROC_BINDINGS_HPP

View File

@ -79,6 +79,20 @@ class houghcircles_test(NewOpenCVTests):
self.assertGreater(float(matches_counter) / len(testCircles), .5)
self.assertLess(float(len(circles) - matches_counter) / len(circles), .75)
circles_acc = cv.HoughCirclesWithAccumulator(
image=img,
method=cv.HOUGH_GRADIENT,
dp=1,
minDist=10,
circles=np.array([]),
param1=150,
param2=45,
minRadius=1,
maxRadius=30)
self.assertEqual(circles_acc.shape, (1, 2, 4))
self.assertEqual(circles_acc[0, 0, 3], 66.)
self.assertEqual(circles_acc[0, 1, 3], 62.)
def test_houghcircles_alt(self):
@ -127,5 +141,21 @@ class houghcircles_test(NewOpenCVTests):
self.assertGreater(float(matches_counter) / len(testCircles), .5)
self.assertLess(float(len(circles) - matches_counter) / len(circles), .75)
circles_acc = cv.HoughCirclesWithAccumulator(
image=img,
method=cv.HOUGH_GRADIENT_ALT,
dp=1,
minDist=10,
circles=np.array([]),
param1=300,
param2=0.9,
minRadius=13,
maxRadius=15)
self.assertEqual(circles_acc.shape, (1, 3, 4))
self.assertEqual(circles_acc[0, 0, 3], 62.)
self.assertEqual(circles_acc[0, 1, 3], 59.)
self.assertEqual(circles_acc[0, 2, 3], 47.)
if __name__ == '__main__':
NewOpenCVTests.bootstrap()