diff --git a/test/src/QRcode.cpp b/test/src/QRcode.cpp index eb42a74..1c04865 100644 --- a/test/src/QRcode.cpp +++ b/test/src/QRcode.cpp @@ -100,7 +100,17 @@ void processFrame(cv::Mat& frame) // Apply image processing steps cv::Mat processedFrame = enhanceImage(frame); - // Create ArUco marker detector + // Create ArUco marker detector with modified parameters + cv::Ptr parameters = cv::aruco::DetectorParameters::create(); + parameters->adaptiveThreshWinSizeMin = 3; + parameters->adaptiveThreshWinSizeMax = 23; + parameters->adaptiveThreshWinSizeStep = 5; + parameters->minMarkerPerimeterRate = 0.005; + parameters->maxMarkerPerimeterRate = 3.0; + parameters->perspectiveRemoveIgnoredMarginPerCell = 0.05; + parameters->cornerRefinementMethod = cv::aruco::CORNER_REFINE_SUBPIX; + parameters->polygonalApproxAccuracyRate = 0.025; + cv::Ptr dictionary = cv::aruco::getPredefinedDictionary(cv::aruco::DICT_4X4_1000); std::vector markerIds; @@ -108,7 +118,30 @@ void processFrame(cv::Mat& frame) std::vector rvecs, tvecs; // Detect markers in the image - cv::aruco::detectMarkers(processedFrame, dictionary, markerCorners, markerIds); + cv::aruco::detectMarkers(processedFrame, dictionary, markerCorners, markerIds, parameters); + + // If no markers are detected, try multi-scale detection + if (markerIds.empty()) + { + for (double scale = 0.5; scale <= 2.0; scale += 0.5) + { + cv::Mat scaledFrame; + cv::resize(processedFrame, scaledFrame, cv::Size(), scale, scale); + cv::aruco::detectMarkers(scaledFrame, dictionary, markerCorners, markerIds, parameters); + if (!markerIds.empty()) + { + // Scale back the marker corners to the original frame size + for (auto& corners : markerCorners) + { + for (auto& corner : corners) + { + corner /= scale; + } + } + break; + } + } + } // Draw detected markers if (!markerIds.empty()) diff --git a/test/src/arenaCalibration.cpp b/test/src/arenaCalibration.cpp index d771911..34a0cfe 100644 --- a/test/src/arenaCalibration.cpp +++ b/test/src/arenaCalibration.cpp @@ -151,6 +151,29 @@ void processFrame(cv::Mat& frame, std::map& markerPositions, c // Detect markers in the image cv::aruco::detectMarkers(processedFrame, dictionary, markerCorners, markerIds, parameters); + // If no markers are detected, try multi-scale detection + if (markerIds.empty()) + { + for (double scale = 0.5; scale <= 2.0; scale += 0.5) + { + cv::Mat scaledFrame; + cv::resize(processedFrame, scaledFrame, cv::Size(), scale, scale); + cv::aruco::detectMarkers(scaledFrame, dictionary, markerCorners, markerIds, parameters); + if (!markerIds.empty()) + { + // Scale back the marker corners to the original frame size + for (auto& corners : markerCorners) + { + for (auto& corner : corners) + { + corner /= scale; + } + } + break; + } + } + } + // Draw detected markers if (!markerIds.empty()) {