mirror of
https://github.com/opencv/opencv.git
synced 2026-07-27 22:33:03 +04:00
1c53fd3777
Consider QRCode ECI encoding #24426 ### Pull Request Readiness Checklist related: https://github.com/opencv/opencv/pull/24350#pullrequestreview-1661658421 1. Add `getEncoding` method to obtain ECI number 2. Add `detectAndDecodeBytes`, `decodeBytes`, `decodeBytesMulti`, `detectAndDecodeBytesMulti` methods in Python (return `bytes`) and Java (return `byte[]`) 3. Allow Python bytes to std::string conversion in general and add `encode(byte[] encoded_info, Mat qrcode)` in Java Python example with Kanji encoding: ```python img = cv.imread("test.png") detect = cv.QRCodeDetector() data, points, straight_qrcode = detect.detectAndDecodeBytes(img) print(data) print(detect.getEncoding(), cv.QRCodeEncoder_ECI_SHIFT_JIS) print(data.decode("shift-jis")) ``` ``` b'\x82\xb1\x82\xf1\x82\xc9\x82\xbf\x82\xcd\x90\xa2\x8aE' 20 20 こんにちは世界 ``` source: https://github.com/opencv/opencv/blob/ba4d6c859d21536f84e0328c16f4cc3e96bf3065/modules/objdetect/test/test_qrcode_encode.cpp#L332  See details at https://github.com/opencv/opencv/wiki/How_to_contribute#making-a-good-pull-request - [x] I agree to contribute to the project under Apache 2 License. - [x] To the best of my knowledge, the proposed patch is not based on a code under GPL or another license that is incompatible with OpenCV - [x] The PR is proposed to the proper branch - [x] There is a reference to the original bug report and related work - [x] There is accuracy test, performance test and test data in opencv_extra repository, if applicable Patch to opencv_extra has the same branch name. - [x] The feature is well documented and sample code can be built with the project CMake
69 lines
3.1 KiB
JSON
69 lines
3.1 KiB
JSON
{
|
|
"ManualFuncs" : {
|
|
"QRCodeEncoder" : {
|
|
"QRCodeEncoder" : {
|
|
"j_code" : [
|
|
"\n",
|
|
"/** Generates QR code from input string.",
|
|
"@param encoded_info Input bytes to encode.",
|
|
"@param qrcode Generated QR code.",
|
|
"*/",
|
|
"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<cv::QRCodeEncoder>* me = (Ptr<cv::QRCodeEncoder>*) self; //TODO: check for NULL",
|
|
" const char* n_encoded_info = reinterpret_cast<char*>(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"
|
|
]
|
|
}
|
|
}
|
|
},
|
|
"type_dict": {
|
|
"NativeByteArray": {
|
|
"j_type" : "byte[]",
|
|
"jn_type": "byte[]",
|
|
"jni_type": "jbyteArray",
|
|
"jni_name": "n_%(n)s",
|
|
"jni_var": "jbyteArray n_%(n)s = env->NewByteArray(static_cast<jsize>(%(n)s.size())); env->SetByteArrayRegion(n_%(n)s, 0, static_cast<jsize>(%(n)s.size()), reinterpret_cast<const jbyte*>(%(n)s.c_str()));",
|
|
"cast_from": "std::string"
|
|
},
|
|
"vector_NativeByteArray": {
|
|
"j_type": "List<byte[]>",
|
|
"jn_type": "List<byte[]>",
|
|
"jni_type": "jobject",
|
|
"jni_var": "std::vector< std::string > %(n)s",
|
|
"suffix": "Ljava_util_List",
|
|
"v_type": "vector_NativeByteArray"
|
|
}
|
|
}
|
|
}
|