diff --git a/modules/wechat_qrcode/src/decodermgr.cpp b/modules/wechat_qrcode/src/decodermgr.cpp index 06706eed2f7..9d392df8c90 100644 --- a/modules/wechat_qrcode/src/decodermgr.cpp +++ b/modules/wechat_qrcode/src/decodermgr.cpp @@ -18,7 +18,7 @@ using zxing::Result; using zxing::UnicomBlock; namespace cv { namespace wechat_qrcode { -int DecoderMgr::decodeImage(cv::Mat src, bool use_nn_detector, string& result) { +int DecoderMgr::decodeImage(cv::Mat src, bool use_nn_detector, string& result, vector& points){ int width = src.cols; int height = src.rows; if (width <= 20 || height <= 20) @@ -46,6 +46,10 @@ int DecoderMgr::decodeImage(cv::Mat src, bool use_nn_detector, string& result) { int ret = TryDecode(source, zx_result); if (!ret) { result = zx_result->getText()->getText(); + auto result_points = zx_result->getResultPoints(); + for(int i=0; i < result_points->size(); i++){ + points.emplace_back(result_points[i]->getX(), result_points[i]->getY()); + } return ret; } // try different binarizers diff --git a/modules/wechat_qrcode/src/decodermgr.hpp b/modules/wechat_qrcode/src/decodermgr.hpp index 10ac16e7c72..c2f29dbe2f9 100644 --- a/modules/wechat_qrcode/src/decodermgr.hpp +++ b/modules/wechat_qrcode/src/decodermgr.hpp @@ -26,7 +26,7 @@ class DecoderMgr { DecoderMgr() { reader_ = new zxing::qrcode::QRCodeReader(); }; ~DecoderMgr(){}; - int decodeImage(cv::Mat src, bool use_nn_detector, string& result); + int decodeImage(cv::Mat src, bool use_nn_detector, string& result, vector& points); private: zxing::Ref qbarUicomBlock_; diff --git a/modules/wechat_qrcode/src/wechat_qrcode.cpp b/modules/wechat_qrcode/src/wechat_qrcode.cpp index 7a4037c9c61..4f3c97e8698 100644 --- a/modules/wechat_qrcode/src/wechat_qrcode.cpp +++ b/modules/wechat_qrcode/src/wechat_qrcode.cpp @@ -119,9 +119,10 @@ vector WeChatQRCode::Impl::decode(const Mat& img, vector& candidate vector decode_results; for (auto& point : candidate_points) { Mat cropped_img; + Align *aligner = NULL; if (use_nn_detector_) { - Align aligner; - cropped_img = cropObj(img, point, aligner); + aligner = new Align(); + cropped_img = cropObj(img, point, *aligner); } else { cropped_img = img; } @@ -132,9 +133,22 @@ vector WeChatQRCode::Impl::decode(const Mat& img, vector& candidate super_resolution_model_->processImageScale(cropped_img, cur_scale, use_nn_sr_); string result; DecoderMgr decodemgr; - auto ret = decodemgr.decodeImage(scaled_img, use_nn_detector_, result); - + vector points_qr; + auto ret = decodemgr.decodeImage(scaled_img, use_nn_detector_, result, points_qr); if (ret == 0) { + for (int i = 0; i < 4; i++) { + points_qr[i].x = points_qr[i].x / cur_scale; + points_qr[i].y = points_qr[i].y / cur_scale; + } + if (use_nn_detector_) { + points_qr = aligner->warpBack(points_qr); + delete aligner; + } + + for(int i = 0; i < 4; i++) { + point.at(i, 0) = points_qr[i].x; + point.at(i, 1) = points_qr[i].y; + } decode_results.push_back(result); points.push_back(point); break;