From c346ee1c29afc423a9b89bdf8c0a6b858f742789 Mon Sep 17 00:00:00 2001 From: MaximSmolskiy Date: Sun, 3 Mar 2024 23:05:29 +0300 Subject: [PATCH] Improve contours approximations in ChessBoardDetector::generateQuads --- modules/calib3d/src/calibinit.cpp | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/modules/calib3d/src/calibinit.cpp b/modules/calib3d/src/calibinit.cpp index ea5e5023b9..7e9b87ba5d 100644 --- a/modules/calib3d/src/calibinit.cpp +++ b/modules/calib3d/src/calibinit.cpp @@ -1796,22 +1796,12 @@ void ChessBoardDetector::generateQuads(const cv::Mat& image_, int flags, int dil if (contour_rect.area() < min_area) continue; - std::vector approx_contour; + std::vector approx_contour = contour; const int min_approx_level = 1, max_approx_level = MAX_CONTOUR_APPROX; - for (int approx_level = min_approx_level; approx_level <= max_approx_level; approx_level++ ) + for (int approx_level = min_approx_level; approx_contour.size() > 4 && approx_level <= max_approx_level; approx_level++ ) { - approxPolyDP(contour, approx_contour, (float)approx_level, true); - if (approx_contour.size() == 4) - break; - - // we call this again on its own output, because sometimes - // approxPoly() does not simplify as much as it should. - std::vector approx_contour_tmp; - std::swap(approx_contour, approx_contour_tmp); - approxPolyDP(approx_contour_tmp, approx_contour, (float)approx_level, true); - if (approx_contour.size() == 4) - break; + approxPolyDP(approx_contour, approx_contour, (float)approx_level, true); } // reject non-quadrangles