mirror of
https://github.com/opencv/opencv.git
synced 2026-01-19 00:07:42 +08:00
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: ba4d6c859d/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
38 lines
956 B
C++
38 lines
956 B
C++
#ifdef HAVE_OPENCV_OBJDETECT
|
|
|
|
#include "opencv2/objdetect.hpp"
|
|
|
|
typedef QRCodeEncoder::Params QRCodeEncoder_Params;
|
|
|
|
typedef HOGDescriptor::HistogramNormType HOGDescriptor_HistogramNormType;
|
|
typedef HOGDescriptor::DescriptorStorageFormat HOGDescriptor_DescriptorStorageFormat;
|
|
|
|
class NativeByteArray
|
|
{
|
|
public:
|
|
inline NativeByteArray& operator=(const std::string& from) {
|
|
val = from;
|
|
return *this;
|
|
}
|
|
std::string val;
|
|
};
|
|
|
|
class vector_NativeByteArray : public std::vector<std::string> {};
|
|
|
|
template<>
|
|
PyObject* pyopencv_from(const NativeByteArray& from)
|
|
{
|
|
return PyBytes_FromStringAndSize(from.val.c_str(), from.val.size());
|
|
}
|
|
|
|
template<>
|
|
PyObject* pyopencv_from(const vector_NativeByteArray& results)
|
|
{
|
|
PyObject* list = PyList_New(results.size());
|
|
for(size_t i = 0; i < results.size(); ++i)
|
|
PyList_SetItem(list, i, PyBytes_FromStringAndSize(results[i].c_str(), results[i].size()));
|
|
return list;
|
|
}
|
|
|
|
#endif
|