diff --git a/modules/objdetect/include/opencv2/objdetect.hpp b/modules/objdetect/include/opencv2/objdetect.hpp index b5ccfb1503..4a8544b910 100644 --- a/modules/objdetect/include/opencv2/objdetect.hpp +++ b/modules/objdetect/include/opencv2/objdetect.hpp @@ -810,12 +810,12 @@ public: CV_WRAP std::string detectAndDecodeCurved(InputArray img, OutputArray points=noArray(), OutputArray straight_qrcode = noArray()); - /** @brief Returns a kid of encoding for the decoded info from the latest QR codes + /** @brief Returns a kind of encoding for the decoded info from the latest @ref decode or @ref detectAndDecode call @param codeIdx an index of the previously decoded QR code. When @ref decode or @ref detectAndDecode is used, valid value is zero. For @ref decodeMulti or @ref detectAndDecodeMulti use indices corresponding to the output order. */ - CV_WRAP QRCodeEncoder::ECIEncodings getEncoding(size_t codeIdx = 0); + CV_WRAP QRCodeEncoder::ECIEncodings getEncoding(int codeIdx = 0); }; class CV_EXPORTS_W_SIMPLE QRCodeDetectorAruco : public GraphicalCodeDetector { diff --git a/modules/objdetect/misc/java/gen_dict.json b/modules/objdetect/misc/java/gen_dict.json new file mode 100644 index 0000000000..4e6139a9da --- /dev/null +++ b/modules/objdetect/misc/java/gen_dict.json @@ -0,0 +1,92 @@ +{ + "ManualFuncs" : { + "QRCodeEncoder" : { + "QRCodeEncoder" : { + "j_code" : [ + "\n", + "/**", + " * Constructor of streaming callback object with abstract 'read' and 'seek' methods that should be implemented in Java code.
", + " * NOTE: Implemented callbacks should be called from the creation thread to avoid JNI performance degradation", + "*/", + "public void encode(byte[] encoded_info, Mat qrcode) {", + " encode_1(nativeObj, encoded_info, qrcode.nativeObj);", + "}", + "\n" + ], + "jn_code": [ + "\n", + "private static native void encode_1(long nativeObj, byte[] encoded_info, long qrcode_nativeObj);", + "\n" + ], + "cpp_code": [ + "//", + "// void cv::QRCodeEncoder::encode(String encoded_info, Mat& qrcode)", + "//", + "\n", + "JNIEXPORT void JNICALL Java_org_opencv_objdetect_QRCodeEncoder_encode_11 (JNIEnv*, jclass, jlong, jbyteArray, jlong);", + "\n", + "JNIEXPORT void JNICALL Java_org_opencv_objdetect_QRCodeEncoder_encode_11", + "(JNIEnv* env, jclass , jlong self, jbyteArray encoded_info, jlong qrcode_nativeObj)", + "{", + "", + " static const char method_name[] = \"objdetect::encode_11()\";", + " try {", + " LOGD(\"%s\", method_name);", + " Ptr* me = (Ptr*) self; //TODO: check for NULL", + " const char* n_encoded_info = reinterpret_cast(env->GetByteArrayElements(encoded_info, NULL));", + " Mat& qrcode = *((Mat*)qrcode_nativeObj);", + " (*me)->encode( n_encoded_info, qrcode );", + " } catch(const std::exception &e) {", + " throwJavaException(env, &e, method_name);", + " } catch (...) {", + " throwJavaException(env, 0, method_name);", + " }", + "}", + "\n" + ] + } + }, + "GraphicalCodeDetector" : { + "GraphicalCodeDetector" : { + "j_code" : [ + "\n", + "public byte[] detectAndDecodeBytes(Mat img) {", + " return detectAndDecodeBytes_0(nativeObj, img.nativeObj);", + "}", + "\n" + ], + "jn_code": [ + "\n", + "private static native byte[] detectAndDecodeBytes_0(long nativeObj, long img_nativeObj);", + "\n" + ], + "cpp_code": [ + "JNIEXPORT jbyteArray JNICALL Java_org_opencv_objdetect_GraphicalCodeDetector_detectAndDecodeBytes_10 (JNIEnv*, jclass, jlong, jlong);", + "\n", + "JNIEXPORT jbyteArray JNICALL Java_org_opencv_objdetect_GraphicalCodeDetector_detectAndDecodeBytes_10", + " (JNIEnv* env, jclass , jlong self, jlong img_nativeObj)", + "{", + " ", + " static const char method_name[] = \"objdetect::detectAndDecodeBytes_10()\";", + " try {", + " LOGD(\"%s\", method_name);", + " cv::GraphicalCodeDetector* me = (cv::GraphicalCodeDetector*) self; //TODO: check for NULL", + " Mat& img = *((Mat*)img_nativeObj);", + " std::string result = me->detectAndDecode( img );", + " jsize sz = result.size();", + " jbyteArray _retval_ = env->NewByteArray(static_cast(sz));", + " env->SetByteArrayRegion(_retval_, 0, sz, reinterpret_cast(&result[0]));", + " return _retval_;", + " } catch(const std::exception &e) {", + " throwJavaException(env, &e, method_name);", + " } catch (...) {", + " throwJavaException(env, 0, method_name);", + " }", + " return 0;", + "}", + "\n" + ] + } + } + } +} diff --git a/modules/objdetect/misc/java/test/QRCodeDetectorTest.java b/modules/objdetect/misc/java/test/QRCodeDetectorTest.java index af567cbc04..f675f47e77 100644 --- a/modules/objdetect/misc/java/test/QRCodeDetectorTest.java +++ b/modules/objdetect/misc/java/test/QRCodeDetectorTest.java @@ -2,13 +2,18 @@ package org.opencv.test.objdetect; import java.util.List; import org.opencv.core.Mat; +import org.opencv.core.Size; import org.opencv.objdetect.QRCodeDetector; +import org.opencv.objdetect.QRCodeEncoder; +import org.opencv.objdetect.QRCodeEncoder_Params; import org.opencv.imgcodecs.Imgcodecs; +import org.opencv.imgproc.Imgproc; import org.opencv.test.OpenCVTestCase; import java.util.Arrays; import java.util.ArrayList; import java.util.HashSet; import java.util.List; +import java.io.UnsupportedEncodingException; public class QRCodeDetectorTest extends OpenCVTestCase { @@ -50,4 +55,21 @@ public class QRCodeDetectorTest extends OpenCVTestCase { List < String > expectedResults = Arrays.asList("SKIP", "EXTRA", "TWO STEPS FORWARD", "STEP BACK", "QUESTION", "STEP FORWARD"); assertEquals(new HashSet(output), new HashSet(expectedResults)); } + + public void testKanji() throws UnsupportedEncodingException { + String inp = new String("こんにちは世界"); + + QRCodeEncoder_Params params = new QRCodeEncoder_Params(); + params.set_mode(QRCodeEncoder.MODE_KANJI); + QRCodeEncoder encoder = QRCodeEncoder.create(params); + + Mat qrcode = new Mat(); + encoder.encode(inp.getBytes("Shift_JIS"), qrcode); + Imgproc.resize(qrcode, qrcode, new Size(0, 0), 2, 2, Imgproc.INTER_NEAREST); + + QRCodeDetector detector = new QRCodeDetector(); + byte[] output = detector.detectAndDecodeBytes(qrcode); + assertEquals(detector.getEncoding(), QRCodeEncoder.ECI_SHIFT_JIS); + assertEquals(inp, new String(output, "Shift_JIS")); + } } diff --git a/modules/objdetect/src/qrcode.cpp b/modules/objdetect/src/qrcode.cpp index 12cb33ff79..ac233f32e1 100644 --- a/modules/objdetect/src/qrcode.cpp +++ b/modules/objdetect/src/qrcode.cpp @@ -980,7 +980,7 @@ public: std::string detectAndDecodeCurved(InputArray in, OutputArray points, OutputArray straight_qrcode); - QRCodeEncoder::ECIEncodings getEncoding(size_t codeIdx); + QRCodeEncoder::ECIEncodings getEncoding(int codeIdx); }; QRCodeDetector::QRCodeDetector() { @@ -997,8 +997,9 @@ QRCodeDetector& QRCodeDetector::setEpsY(double epsY) { return *this; } -QRCodeEncoder::ECIEncodings QRCodeDetector::getEncoding(size_t codeIdx) { +QRCodeEncoder::ECIEncodings QRCodeDetector::getEncoding(int codeIdx) { auto& encodings = std::dynamic_pointer_cast(p)->encodings; + CV_Assert(codeIdx >= 0); CV_Assert(codeIdx < encodings.size()); return encodings[codeIdx]; }