diff --git a/modules/objdetect/include/opencv2/objdetect.hpp b/modules/objdetect/include/opencv2/objdetect.hpp index 70c787a38998..92fb3589e8ba 100644 --- a/modules/objdetect/include/opencv2/objdetect.hpp +++ b/modules/objdetect/include/opencv2/objdetect.hpp @@ -46,6 +46,7 @@ #include "opencv2/core.hpp" #include "opencv2/objdetect/aruco_detector.hpp" +#include "opencv2/objdetect/generic_graphical_code.hpp" /** @defgroup objdetect Object Detection @@ -763,80 +764,7 @@ class CV_EXPORTS_W QRCodeEncoder { CV_WRAP virtual void encodeStructuredAppend(const String& encoded_info, OutputArrayOfArrays qrcodes) = 0; }; - -class CV_EXPORTS_W_SIMPLE QRCodeDetectorBase { -public: - CV_DEPRECATED_EXTERNAL // avoid using in C++ code, will be moved to "protected" (need to fix bindings first) - QRCodeDetectorBase(); - - QRCodeDetectorBase(const QRCodeDetectorBase&) = default; - QRCodeDetectorBase(QRCodeDetectorBase&&) = default; - QRCodeDetectorBase& operator=(const QRCodeDetectorBase&) = default; - QRCodeDetectorBase& operator=(QRCodeDetectorBase&&) = default; - - /** @brief Detects QR code in image and returns the quadrangle containing the code. - @param img grayscale or color (BGR) image containing (or not) QR code. - @param points Output vector of vertices of the minimum-area quadrangle containing the code. - */ - CV_WRAP bool detect(InputArray img, OutputArray points) const; - - /** @brief Decodes QR code in image once it's found by the detect() method. - - Returns UTF8-encoded output string or empty string if the code cannot be decoded. - @param img grayscale or color (BGR) image containing QR code. - @param points Quadrangle vertices found by detect() method (or some other algorithm). - @param straight_qrcode The optional output image containing rectified and binarized QR code - */ - CV_WRAP std::string decode(InputArray img, InputArray points, OutputArray straight_qrcode = noArray()) const; - - /** @brief Both detects and decodes QR code - - @param img grayscale or color (BGR) image containing QR code. - @param points optional output array of vertices of the found QR code quadrangle. Will be empty if not found. - @param straight_qrcode The optional output image containing rectified and binarized QR code - */ - CV_WRAP std::string detectAndDecode(InputArray img, OutputArray points=noArray(), - OutputArray straight_qrcode = noArray()) const; - - - /** @brief Detects QR codes in image and returns the vector of the quadrangles containing the codes. - @param img grayscale or color (BGR) image containing (or not) QR codes. - @param points Output vector of vector of vertices of the minimum-area quadrangle containing the codes. - */ - CV_WRAP - bool detectMulti(InputArray img, OutputArray points) const; - - /** @brief Decodes QR codes in image once it's found by the detect() method. - @param img grayscale or color (BGR) image containing QR codes. - @param decoded_info UTF8-encoded output vector of string or empty vector of string if the codes cannot be decoded. - @param points vector of Quadrangle vertices found by detect() method (or some other algorithm). - @param straight_qrcode The optional output vector of images containing rectified and binarized QR codes - */ - CV_WRAP - bool decodeMulti( - InputArray img, InputArray points, - CV_OUT std::vector& decoded_info, - OutputArrayOfArrays straight_qrcode = noArray() - ) const; - - /** @brief Both detects and decodes QR codes - @param img grayscale or color (BGR) image containing QR codes. - @param decoded_info UTF8-encoded output vector of string or empty vector of string if the codes cannot be decoded. - @param points optional output vector of vertices of the found QR code quadrangles. Will be empty if not found. - @param straight_qrcode The optional output vector of images containing rectified and binarized QR codes - */ - CV_WRAP - bool detectAndDecodeMulti( - InputArray img, CV_OUT std::vector& decoded_info, - OutputArray points = noArray(), - OutputArrayOfArrays straight_qrcode = noArray() - ) const; - struct Impl; -protected: - Ptr p; -}; - -class CV_EXPORTS_W_SIMPLE QRCodeDetector : public QRCodeDetectorBase +class CV_EXPORTS_W_SIMPLE QRCodeDetector : public GenericGraphicalCode { public: CV_WRAP QRCodeDetector(); @@ -877,7 +805,7 @@ class CV_EXPORTS_W_SIMPLE QRCodeDetector : public QRCodeDetectorBase OutputArray straight_qrcode = noArray()); }; -class CV_EXPORTS_W_SIMPLE QRCodeDetectorAruco : public QRCodeDetectorBase { +class CV_EXPORTS_W_SIMPLE QRCodeDetectorAruco : public GenericGraphicalCode { public: CV_WRAP QRCodeDetectorAruco(); diff --git a/modules/objdetect/include/opencv2/objdetect/generic_graphical_code.hpp b/modules/objdetect/include/opencv2/objdetect/generic_graphical_code.hpp new file mode 100644 index 000000000000..3962eafe3464 --- /dev/null +++ b/modules/objdetect/include/opencv2/objdetect/generic_graphical_code.hpp @@ -0,0 +1,93 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html +#ifndef OPENCV_OBJDETECT_GENERIC_GRAPHICAL_CODE_HPP +#define OPENCV_OBJDETECT_GENERIC_GRAPHICAL_CODE_HPP + +#include + +namespace cv { + +//! @addtogroup objdetect_common +//! @{ + +class CV_EXPORTS_W_SIMPLE GenericGraphicalCode { +public: + CV_DEPRECATED_EXTERNAL // avoid using in C++ code, will be moved to "protected" (need to fix bindings first) + GenericGraphicalCode(); + + GenericGraphicalCode(const GenericGraphicalCode&) = default; + GenericGraphicalCode(GenericGraphicalCode&&) = default; + GenericGraphicalCode& operator=(const GenericGraphicalCode&) = default; + GenericGraphicalCode& operator=(GenericGraphicalCode&&) = default; + + /** @brief Detects graphical code in image and returns the quadrangle containing the code. + @param img grayscale or color (BGR) image containing (or not) graphical code. + @param points Output vector of vertices of the minimum-area quadrangle containing the code. + */ + CV_WRAP bool detect(InputArray img, OutputArray points) const; + + /** @brief Decodes graphical code in image once it's found by the detect() method. + + Returns UTF8-encoded output string or empty string if the code cannot be decoded. + @param img grayscale or color (BGR) image containing graphical code. + @param points Quadrangle vertices found by detect() method (or some other algorithm). + @param straight_code The optional output image containing binarized code, will be empty if not found. + */ + CV_WRAP std::string decode(InputArray img, InputArray points, OutputArray straight_qrcode = noArray()) const; + + /** @brief Both detects and decodes graphical code + + @param img grayscale or color (BGR) image containing graphical code. + @param points optional output array of vertices of the found graphical code quadrangle, will be empty if not found. + @param straight_code The optional output image containing binarized code + */ + CV_WRAP std::string detectAndDecode(InputArray img, OutputArray points = noArray(), + OutputArray straight_qrcode = noArray()) const; + + + /** @brief Detects graphical codes in image and returns the vector of the quadrangles containing the codes. + @param img grayscale or color (BGR) image containing (or not) graphical codes. + @param points Output vector of vector of vertices of the minimum-area quadrangle containing the codes. + */ + CV_WRAP bool detectMulti(InputArray img, OutputArray points) const; + + /** @brief Decodes graphical codes in image once it's found by the detect() method. + @param img grayscale or color (BGR) image containing graphical codes. + @param decoded_info UTF8-encoded output vector of string or empty vector of string if the codes cannot be decoded. + @param points vector of Quadrangle vertices found by detect() method (or some other algorithm). + @param straight_code The optional output vector of images containing binarized codes + */ + CV_WRAP bool decodeMulti(InputArray img, InputArray points, CV_OUT std::vector& decoded_info, + OutputArrayOfArrays straight_qrcode = noArray()) const; + + /** @brief Both detects and decodes graphical codes + @param img grayscale or color (BGR) image containing graphical codes. + @param decoded_info UTF8-encoded output vector of string or empty vector of string if the codes cannot be decoded. + @param points optional output vector of vertices of the found graphical code quadrangles. Will be empty if not found. + @param straight_code The optional vector of images containing binarized codes + */ + CV_WRAP bool detectAndDecodeMulti(InputArray img, CV_OUT std::vector& decoded_info, OutputArray points = noArray(), + OutputArrayOfArrays straight_qrcode = noArray()) const; + struct Impl; +protected: + Ptr p; +}; + +struct GenericGraphicalCode::Impl { + virtual ~Impl() {} + virtual bool detect(InputArray img, OutputArray points) const = 0; + virtual std::string decode(InputArray img, InputArray points, OutputArray straight_qrcode) const = 0; + virtual std::string detectAndDecode(InputArray img, OutputArray points, OutputArray straight_qrcode) const = 0; + virtual bool detectMulti(InputArray img, OutputArray points) const = 0; + virtual bool decodeMulti(InputArray img, InputArray points, std::vector& decoded_info, + OutputArrayOfArrays straight_code) const = 0; + virtual bool detectAndDecodeMulti(InputArray img, std::vector& decoded_info, + OutputArray points, OutputArrayOfArrays straight_code) const = 0; +}; + +//! @} + +} + +#endif \ No newline at end of file diff --git a/modules/objdetect/perf/perf_qrcode_pipeline.cpp b/modules/objdetect/perf/perf_qrcode_pipeline.cpp index 9eac2352e378..5379677e3d91 100644 --- a/modules/objdetect/perf/perf_qrcode_pipeline.cpp +++ b/modules/objdetect/perf/perf_qrcode_pipeline.cpp @@ -68,7 +68,7 @@ PERF_TEST_P_(Perf_Objdetect_QRCode_Multi, detectMulti) Mat src = imread(image_path); ASSERT_FALSE(src.empty()) << "Can't read image: " << image_path; std::vector corners; - QRCodeDetectorBase qrcode = QRCodeDetector(); + GenericGraphicalCode qrcode = QRCodeDetector(); if (method == "aruco_based") { qrcode = QRCodeDetectorAruco(); } @@ -90,7 +90,7 @@ PERF_TEST_P_(Perf_Objdetect_QRCode_Multi, decodeMulti) if (disabled_samples.find({name_current_image, method}) != disabled_samples.end()) { throw SkipTestException(name_current_image + " is disabled sample for method " + method); } - QRCodeDetectorBase qrcode = QRCodeDetector(); + GenericGraphicalCode qrcode = QRCodeDetector(); if (method == "aruco_based") { qrcode = QRCodeDetectorAruco(); } diff --git a/modules/objdetect/src/qrcode.cpp b/modules/objdetect/src/qrcode.cpp index 18b2650d9989..1fe807be91d8 100644 --- a/modules/objdetect/src/qrcode.cpp +++ b/modules/objdetect/src/qrcode.cpp @@ -7,6 +7,7 @@ #include "precomp.hpp" #include "opencv2/objdetect.hpp" +#include "opencv2/objdetect/generic_graphical_code.hpp" #include "opencv2/calib3d.hpp" #include @@ -950,53 +951,41 @@ vector QRDetect::getQuadrilateral(vector angle_list) return result_angle_list; } -struct QRCodeDetectorBase::Impl { - virtual ~Impl() {} - virtual bool detect(InputArray img, OutputArray points) const = 0; - virtual std::string decode(InputArray img, InputArray points, OutputArray straight_qrcode) const = 0; - virtual std::string detectAndDecode(InputArray img, OutputArray points, OutputArray straight_qrcode) const = 0; - virtual bool detectMulti(InputArray img, OutputArray points) const = 0; - virtual bool decodeMulti(InputArray img, InputArray points, std::vector& decoded_info, - OutputArrayOfArrays straight_qrcode) const = 0; - virtual bool detectAndDecodeMulti(InputArray img, std::vector& decoded_info, OutputArray points, - OutputArrayOfArrays straight_qrcode) const = 0; -}; - -QRCodeDetectorBase::QRCodeDetectorBase() {} +GenericGraphicalCode::GenericGraphicalCode() {} -bool QRCodeDetectorBase::detect(InputArray img, OutputArray points) const { +bool GenericGraphicalCode::detect(InputArray img, OutputArray points) const { CV_Assert(p); return p->detect(img, points); } -std::string QRCodeDetectorBase::decode(InputArray img, InputArray points, OutputArray straight_qrcode) const { +std::string GenericGraphicalCode::decode(InputArray img, InputArray points, OutputArray straight_code) const { CV_Assert(p); - return p->decode(img, points, straight_qrcode); + return p->decode(img, points, straight_code); } -std::string QRCodeDetectorBase::detectAndDecode(InputArray img, OutputArray points, OutputArray straight_qrcode) const { +std::string GenericGraphicalCode::detectAndDecode(InputArray img, OutputArray points, OutputArray straight_code) const { CV_Assert(p); - return p->detectAndDecode(img, points, straight_qrcode); + return p->detectAndDecode(img, points, straight_code); } -bool QRCodeDetectorBase::detectMulti(InputArray img, OutputArray points) const { +bool GenericGraphicalCode::detectMulti(InputArray img, OutputArray points) const { CV_Assert(p); return p->detectMulti(img, points); } -bool QRCodeDetectorBase::decodeMulti(InputArray img, InputArray points, std::vector& decoded_info, - OutputArrayOfArrays straight_qrcode) const { +bool GenericGraphicalCode::decodeMulti(InputArray img, InputArray points, std::vector& decoded_info, + OutputArrayOfArrays straight_code) const { CV_Assert(p); - return p->decodeMulti(img, points, decoded_info, straight_qrcode); + return p->decodeMulti(img, points, decoded_info, straight_code); } -bool QRCodeDetectorBase::detectAndDecodeMulti(InputArray img, std::vector& decoded_info, - OutputArray points, OutputArrayOfArrays straight_qrcode) const { +bool GenericGraphicalCode::detectAndDecodeMulti(InputArray img, std::vector& decoded_info, OutputArray points, + OutputArrayOfArrays straight_code) const { CV_Assert(p); - return p->detectAndDecodeMulti(img, decoded_info, points, straight_qrcode); + return p->detectAndDecodeMulti(img, decoded_info, points, straight_code); } -struct ImplContour : public QRCodeDetectorBase::Impl +struct ImplContour : public GenericGraphicalCode::Impl { public: ImplContour(): epsX(0.2), epsY(0.1) {} diff --git a/modules/objdetect/test/test_qrcode.cpp b/modules/objdetect/test/test_qrcode.cpp index 609cc6dd2e5c..e7eee4c059c6 100644 --- a/modules/objdetect/test/test_qrcode.cpp +++ b/modules/objdetect/test/test_qrcode.cpp @@ -369,7 +369,7 @@ TEST_P(Objdetect_QRCode_Multi, regression) ASSERT_FALSE(src.empty()) << "Can't read image: " << image_path; if (disabled_samples.find({name_current_image, method}) != disabled_samples.end()) throw SkipTestException(name_current_image + " is disabled sample for method " + method); - QRCodeDetectorBase qrcode = QRCodeDetector(); + GenericGraphicalCode qrcode = QRCodeDetector(); if (method == "aruco_based") { qrcode = QRCodeDetectorAruco(); } @@ -427,7 +427,7 @@ TEST_P(Objdetect_QRCode_detectMulti, detect_regression_16961) Mat src = imread(image_path); ASSERT_FALSE(src.empty()) << "Can't read image: " << image_path; - QRCodeDetectorBase qrcode = QRCodeDetector(); + GenericGraphicalCode qrcode = QRCodeDetector(); if (method == "aruco_based") { qrcode = QRCodeDetectorAruco(); } @@ -450,7 +450,7 @@ TEST_P(Objdetect_QRCode_detectAndDecodeMulti, check_output_parameters_type_19363 Mat src = imread(image_path); ASSERT_FALSE(src.empty()) << "Can't read image: " << image_path; #ifdef HAVE_QUIRC - QRCodeDetectorBase qrcode = QRCodeDetector(); + GenericGraphicalCode qrcode = QRCodeDetector(); if (method == "aruco_based") { qrcode = QRCodeDetectorAruco(); } @@ -619,7 +619,7 @@ TEST_P(Objdetect_QRCode_detectAndDecodeMulti, decode_9_qrcodes_version7) std::string image_path = findDataFile(root + name_current_image); Mat src = imread(image_path); const std::string method = GetParam(); - QRCodeDetectorBase qrcode = QRCodeDetector(); + GenericGraphicalCode qrcode = QRCodeDetector(); if (method == "aruco_based") { qrcode = QRCodeDetectorAruco(); } diff --git a/samples/cpp/qrcode.cpp b/samples/cpp/qrcode.cpp index 84ef62154345..f0d2e900b57e 100644 --- a/samples/cpp/qrcode.cpp +++ b/samples/cpp/qrcode.cpp @@ -160,7 +160,7 @@ void drawQRCodeResults(Mat& frame, const vector& corners, const vector& corners, vector& decode_info // +global: bool g_modeMultiQR, bool g_detectOnly ) @@ -194,7 +194,7 @@ void runQR( } static -double processQRCodeDetection(const QRCodeDetectorBase& qrcode, const Mat& input, Mat& result, vector& corners) +double processQRCodeDetection(const GenericGraphicalCode& qrcode, const Mat& input, Mat& result, vector& corners) { if (input.channels() == 1) cvtColor(input, result, COLOR_GRAY2BGR); @@ -232,7 +232,7 @@ int liveQRCodeDetect() cout << "Press 'd' to switch between decoder and detector" << endl; cout << "Press ' ' (space) to save result into images" << endl; cout << "Press 'ESC' to exit" << endl; - QRCodeDetectorBase qrcode = QRCodeDetector(); + GenericGraphicalCode qrcode = QRCodeDetector(); if (g_useArucoBased) qrcode = QRCodeDetectorAruco(); @@ -315,7 +315,7 @@ int imageQRCodeDetect(const string& in_file) << " on image: " << input.size() << " (" << typeToString(input.type()) << ")" << endl; - QRCodeDetectorBase qrcode = QRCodeDetector(); + GenericGraphicalCode qrcode = QRCodeDetector(); if (g_useArucoBased) qrcode = QRCodeDetectorAruco();