@@ -34,33 +34,33 @@ QRCodeReader::QRCodeReader() : decoder_() {
3434 smoothMaxMultiple_ = 40 ;
3535}
3636
37- Ref<Result> QRCodeReader::decode (Ref<BinaryBitmap> image) { return decode (image, DecodeHints ()); }
37+ vector< Ref<Result> > QRCodeReader::decode (Ref<BinaryBitmap> image) { return decode (image, DecodeHints ()); }
3838
39- Ref<Result> QRCodeReader::decode (Ref<BinaryBitmap> image, DecodeHints hints) {
39+ vector< Ref<Result> > QRCodeReader::decode (Ref<BinaryBitmap> image, DecodeHints hints) {
4040 // Binarize image using the Histogram Binarized method and be binarized
4141 ErrorHandler err_handler;
42+ vector<Ref<Result>> result_list;
4243 Ref<BitMatrix> imageBitMatrix = image->getBlackMatrix (err_handler);
43- if (err_handler.ErrCode () || imageBitMatrix == NULL ) return Ref<Result>() ;
44+ if (err_handler.ErrCode () || imageBitMatrix == NULL ) return result_list ;
4445
45- Ref<Result> rst = decodeMore (image, imageBitMatrix, hints, err_handler);
46- if (err_handler.ErrCode () || rst == NULL ) {
46+ vector< Ref<Result> > rst = decodeMore (image, imageBitMatrix, hints, err_handler);
47+ if (err_handler.ErrCode () || rst. empty () ) {
4748 // black white mirro!!!
4849 Ref<BitMatrix> invertedMatrix = image->getInvertedMatrix (err_handler);
49- if (err_handler.ErrCode () || invertedMatrix == NULL ) return Ref<Result>();
50- Ref<Result> tmp_rst = decodeMore (image, invertedMatrix, hints, err_handler);
51- if (err_handler.ErrCode () || tmp_rst == NULL ) return Ref<Result>();
52- return tmp_rst;
50+ if (err_handler.ErrCode () || invertedMatrix == NULL ) return result_list;
51+ vector<Ref<Result>> tmp_rst = decodeMore (image, invertedMatrix, hints, err_handler);
52+ if (err_handler.ErrCode () || tmp_rst.empty ()) return tmp_rst;
5353 }
5454
5555 return rst;
5656}
5757
58- Ref<Result> QRCodeReader::decodeMore (Ref<BinaryBitmap> image, Ref<BitMatrix> imageBitMatrix,
58+ vector< Ref<Result> > QRCodeReader::decodeMore (Ref<BinaryBitmap> image, Ref<BitMatrix> imageBitMatrix,
5959 DecodeHints hints, ErrorHandler &err_handler) {
6060 nowHints_ = hints;
6161 std::string ept;
62-
63- if (imageBitMatrix == NULL ) return Ref<Result>() ;
62+ vector<Ref<Result>> result_list;
63+ if (imageBitMatrix == NULL ) return result_list ;
6464 image->m_poUnicomBlock ->Init ();
6565 image->m_poUnicomBlock ->Reset (imageBitMatrix);
6666
@@ -88,7 +88,7 @@ Ref<Result> QRCodeReader::decodeMore(Ref<BinaryBitmap> image, Ref<BitMatrix> ima
8888 Ref<FinderPatternInfo> patternInfo = detector->getFinderPatternInfo (i);
8989 setPatternFix (patternInfo->getPossibleFix ());
9090 if (patternInfo->getAnglePossibleFix () < 0.6 && i) continue ;
91-
91+ bool patternFoundFlag = false ;
9292 int possibleAlignmentCount = 0 ;
9393 possibleAlignmentCount = detector->getPossibleAlignmentCount (i);
9494 if (possibleAlignmentCount < 0 ) continue ;
@@ -99,6 +99,7 @@ Ref<Result> QRCodeReader::decodeMore(Ref<BinaryBitmap> image, Ref<BitMatrix> ima
9999
100100 vector<bool > needTryVariousDeimensions (possibleAlignmentCount, false );
101101 for (int j = 0 ; j < possibleAlignmentCount; j++) {
102+ if (patternFoundFlag){break ;}
102103 ArrayRef<Ref<ResultPoint> > points;
103104 err_handler.Reset ();
104105 Ref<DetectorResult> detectorResult =
@@ -142,11 +143,15 @@ Ref<Result> QRCodeReader::decodeMore(Ref<BinaryBitmap> image, Ref<BitMatrix> ima
142143 decoderResult->getCharset (), decoderResult->getQRCodeVersion (),
143144 decoderResult->getEcLevel (), decoderResult->getCharsetMode ()));
144145 setSuccFix (points);
145-
146- return result;
146+ result_list.push_back (result);
147+ patternFoundFlag = true ;
148+ if (nowHints_.getUseNNDetector ()) {
149+ return result_list;
150+ }
147151 }
148152 // try different dimentions
149153 for (int j = 0 ; j < possibleAlignmentCount; j++) {
154+ if (patternFoundFlag){break ;}
150155 err_handler.Reset ();
151156 ArrayRef<Ref<ResultPoint> > points;
152157 if (needTryVariousDeimensions[j]) {
@@ -188,13 +193,17 @@ Ref<Result> QRCodeReader::decodeMore(Ref<BinaryBitmap> image, Ref<BitMatrix> ima
188193 decoderResult->getEcLevel (), decoderResult->getCharsetMode ()));
189194
190195 setSuccFix (points);
191- return result;
196+ result_list.push_back (result);
197+ patternFoundFlag = true ;
198+ if (nowHints_.getUseNNDetector ()) {
199+ return result_list;
200+ }
192201 }
193202 }
194203 }
195204 }
196205 }
197- return Ref<Result>() ;
206+ return result_list ;
198207}
199208
200209vector<int > QRCodeReader::getPossibleDimentions (int detectDimension) {
0 commit comments