Browse Source

Enable specifying parameters in QRCodeEncoder constructor.

master
Canming Huang 3 days ago
parent
commit
b52cbfbc74
  1. 18
      Emgu.CV.Extern/objdetect/QRCodeDetector.cpp
  2. 9
      Emgu.CV.Extern/objdetect/objdetect_c.h
  3. 9
      Emgu.CV.Test/AutoTestVarious.cs
  4. 114
      Emgu.CV/Objdetect/QRCodeEncoder.cs

18
Emgu.CV.Extern/objdetect/QRCodeDetector.cpp

@ -65,9 +65,19 @@ void cveQRCodeDetectorArucoRelease(cv::QRCodeDetectorAruco** detector)
#endif #endif
} }
cv::QRCodeEncoder* cveQRCodeEncoderCreate(cv::Ptr<cv::QRCodeEncoder>** sharedPtr)
{
#ifdef HAVE_OPENCV_OBJDETECT
cv::QRCodeEncoder* cveQRCodeEncoderCreate(
cv::Ptr<cv::QRCodeEncoder>** sharedPtr,
int version,
int correctionLevel,
int mode,
int structureNumber)
{
#ifdef HAVE_OPENCV_OBJDETECT
cv::QRCodeEncoder::Params p;
p.version = version;
p.correction_level = static_cast<cv::QRCodeEncoder::CorrectionLevel>(correctionLevel);
p.mode = static_cast<cv::QRCodeEncoder::EncodeMode>(mode);
p.structure_number = structureNumber;
cv::Ptr<cv::QRCodeEncoder> ptr = cv::QRCodeEncoder::create(); cv::Ptr<cv::QRCodeEncoder> ptr = cv::QRCodeEncoder::create();
*sharedPtr = new cv::Ptr<cv::QRCodeEncoder>(ptr); *sharedPtr = new cv::Ptr<cv::QRCodeEncoder>(ptr);
return ptr.get(); return ptr.get();
@ -87,7 +97,7 @@ void cveQRCodeEncoderRelease(cv::QRCodeEncoder** encoder, cv::Ptr<cv::QRCodeEnco
#endif #endif
} }
void cveQRCodeEncode(cv::QRCodeEncoder* encoder, cv::String* encodedInfo, cv::_OutputArray* qrcode)
void cveQRCodeEncoderEncode(cv::QRCodeEncoder* encoder, cv::String* encodedInfo, cv::_OutputArray* qrcode)
{ {
#ifdef HAVE_OPENCV_OBJDETECT #ifdef HAVE_OPENCV_OBJDETECT
encoder->encode(*encodedInfo, *qrcode); encoder->encode(*encodedInfo, *qrcode);

9
Emgu.CV.Extern/objdetect/objdetect_c.h

@ -117,9 +117,14 @@ CVAPI(void) cveQRCodeDetectorRelease(cv::QRCodeDetector** detector);
CVAPI(void) cveQRCodeDetectorDecodeCurved(cv::QRCodeDetector* detector, cv::_InputArray* img, cv::_InputArray* points, cv::String* decodedInfo, cv::_OutputArray* straightCode); CVAPI(void) cveQRCodeDetectorDecodeCurved(cv::QRCodeDetector* detector, cv::_InputArray* img, cv::_InputArray* points, cv::String* decodedInfo, cv::_OutputArray* straightCode);
CVAPI(int) cveQRCodeDetectorGetEncoding(cv::QRCodeDetector* detector, int codeIdx); CVAPI(int) cveQRCodeDetectorGetEncoding(cv::QRCodeDetector* detector, int codeIdx);
CVAPI(cv::QRCodeEncoder*) cveQRCodeEncoderCreate(cv::Ptr<cv::QRCodeEncoder>** sharedPtr);
CVAPI(cv::QRCodeEncoder*) cveQRCodeEncoderCreate(
cv::Ptr<cv::QRCodeEncoder>** sharedPtr,
int version,
int correctionLevel,
int mode,
int structureNumber);
CVAPI(void) cveQRCodeEncoderRelease(cv::QRCodeEncoder** encoder, cv::Ptr<cv::QRCodeEncoder>** sharedPtr); CVAPI(void) cveQRCodeEncoderRelease(cv::QRCodeEncoder** encoder, cv::Ptr<cv::QRCodeEncoder>** sharedPtr);
CVAPI(void) cveQRCodeEncode(cv::QRCodeEncoder* encoder, cv::String* encodedInfo, cv::_OutputArray* qrcode);
CVAPI(void) cveQRCodeEncoderEncode(cv::QRCodeEncoder* encoder, cv::String* encodedInfo, cv::_OutputArray* qrcode);
CVAPI(cv::QRCodeDetectorAruco*) cveQRCodeDetectorArucoCreate(cv::GraphicalCodeDetector** graphicalCodeDetector); CVAPI(cv::QRCodeDetectorAruco*) cveQRCodeDetectorArucoCreate(cv::GraphicalCodeDetector** graphicalCodeDetector);
CVAPI(void) cveQRCodeDetectorArucoRelease(cv::QRCodeDetectorAruco** detector); CVAPI(void) cveQRCodeDetectorArucoRelease(cv::QRCodeDetectorAruco** detector);

9
Emgu.CV.Test/AutoTestVarious.cs

@ -4348,8 +4348,14 @@ namespace Emgu.CV.Test
} }
[Test] [Test]
public void TestQCCode()
public void TestQRCode()
{ {
using (QRCodeEncoder encoder = new QRCodeEncoder())
using (Mat qrcodeImg = new Mat())
{
encoder.Encode("https://www.emgu.com", qrcodeImg);
}
using (Mat m = EmguAssert.LoadMat("link_github_ocv.jpg")) using (Mat m = EmguAssert.LoadMat("link_github_ocv.jpg"))
using (QRCodeDetector detector = new QRCodeDetector()) using (QRCodeDetector detector = new QRCodeDetector())
using (VectorOfPoint pts = new VectorOfPoint()) using (VectorOfPoint pts = new VectorOfPoint())
@ -4359,6 +4365,7 @@ namespace Emgu.CV.Test
String text = detector.Decode(m, pts); String text = detector.Decode(m, pts);
} }
} }
} }
[Test] [Test]

114
Emgu.CV/Objdetect/QRCodeEncoder.cs

@ -18,6 +18,82 @@ namespace Emgu.CV
/// </summary> /// </summary>
public partial class QRCodeEncoder : SharedPtrObject public partial class QRCodeEncoder : SharedPtrObject
{ {
/// <summary>
/// Specifies the encoding mode for the QR Code encoder.
/// </summary>
public enum EncodeMode
{
/// <summary>
/// Automatically selects the most suitable encoding mode based on the input data.
/// </summary>
Auto = -1,
/// <summary>
/// Represents the numeric encoding mode for the QR Code encoder.
/// This mode is used to encode numeric data (digits 0-9) efficiently,
/// allowing up to 3 digits to be encoded per byte.
/// </summary>
Numeric = 1, // 0b0001
/// <summary>
/// Represents the alphanumeric encoding mode for the QR Code encoder.
/// </summary>
/// <remarks>
/// This mode allows encoding of alphanumeric characters, including digits (0-9),
/// uppercase letters (A-Z), and a limited set of special characters
/// (space, $, %, *, +, -, ., /, :).
/// </remarks>
Alphanumeric = 2, // 0b0010
/// <summary>
/// Represents the Byte encoding mode for the QR Code encoder.
/// This mode allows encoding data in 8-bit byte format, supporting a wide range of characters.
/// </summary>
Byte = 4, // 0b0100
/// <summary>
/// Specifies the Extended Channel Interpretation (ECI) encoding mode for the QR Code encoder.
/// This mode allows the inclusion of character sets or encodings beyond the default QR Code character set.
/// </summary>
Eci = 7, // 0b0111
/// <summary>
/// Specifies the Kanji encoding mode for the QR Code encoder.
/// </summary>
/// <remarks>
/// This mode is used to encode characters in the Shift JIS character set,
/// which is commonly used for Japanese text. It allows efficient encoding
/// of Kanji characters into QR codes.
/// </remarks>
Kanji = 8, // 0b1000
/// <summary>
/// Represents the Structured Append encoding mode for the QR Code encoder.
/// </summary>
/// <remarks>
/// The Structured Append mode allows multiple QR codes to be combined into a single logical message.
/// This is useful when the data to be encoded exceeds the capacity of a single QR code.
/// </remarks>
StructuredAppend = 3 // 0b0011
}
/// <summary>
/// Specifies the error correction levels for QR codes.
/// </summary>
public enum CorrectionLevel
{
/// <summary>
/// Low error correction level. Recovers approximately 7% of data.
/// </summary>
L = 0,
/// <summary>
/// Medium error correction level. Recovers approximately 15% of data.
/// </summary>
M = 1,
/// <summary>
/// Quartile error correction level. Recovers approximately 25% of data.
/// </summary>
Q = 2,
/// <summary>
/// High error correction level. Recovers approximately 30% of data.
/// </summary>
H = 3
};
/// <summary> /// <summary>
/// Specifies the Extended Channel Interpretations (ECI) encodings supported by the QR Code encoder. /// Specifies the Extended Channel Interpretations (ECI) encodings supported by the QR Code encoder.
/// </summary> /// </summary>
@ -30,7 +106,7 @@ namespace Emgu.CV
public enum ECIEncodings public enum ECIEncodings
{ {
/// <summary> /// <summary>
///
/// Represents the Shift JIS encoding, which is a character encoding for the Japanese language.
/// </summary> /// </summary>
ShiftJis = 20, ShiftJis = 20,
/// <summary> /// <summary>
@ -42,9 +118,34 @@ namespace Emgu.CV
/// <summary> /// <summary>
/// Initializes a new instance of the <see cref="QRCodeEncoder"/> class. /// Initializes a new instance of the <see cref="QRCodeEncoder"/> class.
/// </summary> /// </summary>
public QRCodeEncoder()
/// <param name="version">
/// The version of the QR code to generate. A value of 0 indicates automatic version selection.
/// </param>
/// <param name="correctionLevel">
/// The error correction level for the QR code. This determines the level of error correction
/// applied to the QR code. Possible values are <see cref="CorrectionLevel.L"/>,
/// <see cref="CorrectionLevel.M"/>, <see cref="CorrectionLevel.Q"/>, and <see cref="CorrectionLevel.H"/>.
/// </param>
/// <param name="mode">
/// The encoding mode for the QR code. This specifies the type of data to encode, such as
/// numeric, alphanumeric, byte, or kanji. Possible values are defined in <see cref="EncodeMode"/>.
/// </param>
/// <param name="structureNumber">
/// The structure number for structured append mode. This is used when the QR code is part of
/// a structured append sequence. Default is 1.
/// </param>
public QRCodeEncoder(
int version = 0,
QRCodeEncoder.CorrectionLevel correctionLevel = CorrectionLevel.L,
QRCodeEncoder.EncodeMode mode = EncodeMode.Auto,
int structureNumber = 1)
{ {
_ptr = ObjdetectInvoke.cveQRCodeEncoderCreate(ref _sharedPtr);
_ptr = ObjdetectInvoke.cveQRCodeEncoderCreate(
ref _sharedPtr,
version,
correctionLevel,
mode,
structureNumber);
} }
/// <summary> /// <summary>
@ -79,7 +180,12 @@ namespace Emgu.CV
public static partial class ObjdetectInvoke public static partial class ObjdetectInvoke
{ {
[DllImport(CvInvoke.ExternLibrary, CallingConvention = CvInvoke.CvCallingConvention)] [DllImport(CvInvoke.ExternLibrary, CallingConvention = CvInvoke.CvCallingConvention)]
internal static extern IntPtr cveQRCodeEncoderCreate(ref IntPtr sharedPtr);
internal static extern IntPtr cveQRCodeEncoderCreate(
ref IntPtr sharedPtr,
int version,
QRCodeEncoder.CorrectionLevel correctionLevel,
QRCodeEncoder.EncodeMode mode,
int structureNumber);
[DllImport(CvInvoke.ExternLibrary, CallingConvention = CvInvoke.CvCallingConvention)] [DllImport(CvInvoke.ExternLibrary, CallingConvention = CvInvoke.CvCallingConvention)]
internal static extern void cveQRCodeEncoderRelease(ref IntPtr ptr, ref IntPtr sharedPtr); internal static extern void cveQRCodeEncoderRelease(ref IntPtr ptr, ref IntPtr sharedPtr);

Loading…
Cancel
Save