Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
81 changes: 81 additions & 0 deletions doc/QRCode-Support.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
# QRCode Support in OpenCV.js

This document explains the current state of QR code functionality in opencv-js.

## Available QR Code Functionality

### QRCodeDetector ✅
The `QRCodeDetector` class is fully available and functional:

```typescript
const detector = new cv.QRCodeDetector();
const image = cv.imread(imageElement);
const points = new cv.Mat();
const straightQrcode = new cv.Mat();

// Detect and decode QR code
const decodedText = detector.detectAndDecode(image, points, straightQrcode);
console.log("Decoded text:", decodedText);
```

### QRCodeDetectorAruco ✅
Enhanced QR code detection using ArUco-based methods:

```typescript
const params = new cv.QRCodeDetectorAruco_Params();
const detector = new cv.QRCodeDetectorAruco(params);
```

### QRCodeEncoder Constants ✅
All QRCodeEncoder constants are available:

```typescript
// Correction levels
cv.QRCodeEncoder_CORRECT_LEVEL_L // Low
cv.QRCodeEncoder_CORRECT_LEVEL_M // Medium
cv.QRCodeEncoder_CORRECT_LEVEL_Q // Quartile
cv.QRCodeEncoder_CORRECT_LEVEL_H // High

// Encoding modes
cv.QRCodeEncoder_MODE_NUMERIC
cv.QRCodeEncoder_MODE_ALPHANUMERIC
cv.QRCodeEncoder_MODE_BYTE
cv.QRCodeEncoder_MODE_KANJI
cv.QRCodeEncoder_MODE_ECI
cv.QRCodeEncoder_MODE_STRUCTURED_APPEND
cv.QRCodeEncoder_MODE_AUTO

// ECI encodings
cv.QRCodeEncoder_ECI_UTF8
```

### QRCodeEncoder Enums ✅
Enum classes are available:

```typescript
cv.QRCodeEncoder_CorrectionLevel
cv.QRCodeEncoder_EncodeMode
cv.QRCodeEncoder_ECIEncodings
```

## Missing Functionality

### QRCodeEncoder Class ❌
The actual `QRCodeEncoder` class is **not available** in the current OpenCV.js build, although TypeScript definitions are provided for future compatibility.

```typescript
// This will throw an error:
const encoder = new cv.QRCodeEncoder(); // ❌ Not available
```

## Workarounds

For QR code generation, consider using external libraries such as:

- [qrcode](https://www.npmjs.com/package/qrcode)
- [qr-code-generator](https://www.npmjs.com/package/qr-code-generator)
- [qrious](https://www.npmjs.com/package/qrious)

## Future Support

The TypeScript definitions for `QRCodeEncoder` are included for when this functionality becomes available in future OpenCV.js builds.
103 changes: 103 additions & 0 deletions src/types/opencv/objdetect.ts
Original file line number Diff line number Diff line change
Expand Up @@ -107,3 +107,106 @@ export {
QRCodeDetectorAruco,
QRCodeDetectorAruco_Params,
} from "./QRCodeDetectorAruco";

/**
* QRCodeEncoder class for generating QR codes.
*
* Note: This class is not currently available in the OpenCV.js build,
* although the constants and enums are available. This is a type definition
* for compatibility and future support.
*
* @see https://github.com/TechStark/opencv-js/issues/58
*/
export declare class QRCodeEncoder {
/**
* Creates a new QRCodeEncoder instance.
* @param parameters Optional parameters for QR code generation
*/
constructor(parameters?: QRCodeEncoder_Params);

/**
* Encode text data into a QR code.
* @param encoded_info The text data to encode
* @param qrcode Output matrix containing the generated QR code
*/
encode(encoded_info: string, qrcode: any): void;

/**
* Encode text data into a QR code with specified parameters.
* @param encoded_info The text data to encode
* @param qrcode Output matrix containing the generated QR code
* @param params Parameters for QR code generation
*/
encodeStructuredAppend(encoded_info: string, qrcode: any, params: QRCodeEncoder_Params): void;
}

/**
* Parameters for QRCodeEncoder.
*/
export declare class QRCodeEncoder_Params {
constructor();

/**
* The version of the QR code (size). If 0, the optimal version is chosen.
*/
version: int;

/**
* The error correction level.
*/
correction_level: QRCodeEncoder_CorrectionLevel;

/**
* The encoding mode.
*/
mode: QRCodeEncoder_EncodeMode;

/**
* The structure append index for structured append mode.
*/
structure_number: int;
}

/**
* QR Code error correction levels.
*/
export declare enum QRCodeEncoder_CorrectionLevel {
CORRECT_LEVEL_L = 0,
CORRECT_LEVEL_M = 1,
CORRECT_LEVEL_Q = 2,
CORRECT_LEVEL_H = 3
}

/**
* QR Code encoding modes.
*/
export declare enum QRCodeEncoder_EncodeMode {
MODE_NUMERIC = 0,
MODE_ALPHANUMERIC = 1,
MODE_BYTE = 2,
MODE_KANJI = 3,
MODE_ECI = 4,
MODE_STRUCTURED_APPEND = 5,
MODE_AUTO = 6
}

/**
* QR Code ECI encodings.
*/
export declare enum QRCodeEncoder_ECIEncodings {
ECI_UTF8 = 26
}

// QRCodeEncoder constants (already available in runtime)
export declare const QRCodeEncoder_CORRECT_LEVEL_L: any;
export declare const QRCodeEncoder_CORRECT_LEVEL_M: any;
export declare const QRCodeEncoder_CORRECT_LEVEL_Q: any;
export declare const QRCodeEncoder_CORRECT_LEVEL_H: any;
export declare const QRCodeEncoder_MODE_NUMERIC: any;
export declare const QRCodeEncoder_MODE_ALPHANUMERIC: any;
export declare const QRCodeEncoder_MODE_BYTE: any;
export declare const QRCodeEncoder_MODE_KANJI: any;
export declare const QRCodeEncoder_MODE_ECI: any;
export declare const QRCodeEncoder_MODE_STRUCTURED_APPEND: any;
export declare const QRCodeEncoder_MODE_AUTO: any;
export declare const QRCodeEncoder_ECI_UTF8: any;
47 changes: 47 additions & 0 deletions test/QRCodeDetector.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -250,4 +250,51 @@ describe("QRCodeDetectorAruco_Params", () => {
// Just verify we can call delete without errors
expect(() => params.delete()).not.toThrow();
});
});

describe("QRCodeEncoder", () => {
it("should have QRCodeEncoder constants available", () => {
// Verify correction level constants are available
expect(cv.QRCodeEncoder_CORRECT_LEVEL_L).toBeDefined();
expect(cv.QRCodeEncoder_CORRECT_LEVEL_M).toBeDefined();
expect(cv.QRCodeEncoder_CORRECT_LEVEL_Q).toBeDefined();
expect(cv.QRCodeEncoder_CORRECT_LEVEL_H).toBeDefined();

// Verify mode constants are available
expect(cv.QRCodeEncoder_MODE_NUMERIC).toBeDefined();
expect(cv.QRCodeEncoder_MODE_ALPHANUMERIC).toBeDefined();
expect(cv.QRCodeEncoder_MODE_BYTE).toBeDefined();
expect(cv.QRCodeEncoder_MODE_KANJI).toBeDefined();
expect(cv.QRCodeEncoder_MODE_ECI).toBeDefined();
expect(cv.QRCodeEncoder_MODE_STRUCTURED_APPEND).toBeDefined();
expect(cv.QRCodeEncoder_MODE_AUTO).toBeDefined();

// Verify encoding constant is available
expect(cv.QRCodeEncoder_ECI_UTF8).toBeDefined();
});

it("should have QRCodeEncoder enums available", () => {
// Verify CorrectionLevel enum exists
expect(cv.QRCodeEncoder_CorrectionLevel).toBeDefined();

// Verify EncodeMode enum exists
expect(cv.QRCodeEncoder_EncodeMode).toBeDefined();

// Verify ECIEncodings enum exists
expect(cv.QRCodeEncoder_ECIEncodings).toBeDefined();
});

it("QRCodeEncoder class is documented as not available in current build", () => {
// This test documents the known limitation that QRCodeEncoder class
// is not available in the current OpenCV.js build, even though
// the constants and enums are available.
//
// The TypeScript definitions are provided for future compatibility
// and to avoid compilation errors when using the constants.
//
// See: https://github.com/TechStark/opencv-js/issues/58

// This will fail if the class becomes available in a future build
expect(cv.QRCodeEncoder).toBeUndefined();
});
});
55 changes: 55 additions & 0 deletions test/QRCodeEncoder.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
import { setupOpenCv } from "./cv";

beforeAll(setupOpenCv);

describe("QRCodeEncoder", () => {
it("should have correction level constants", () => {
expect(typeof cv.QRCodeEncoder_CORRECT_LEVEL_Q).toBe('number');
expect(typeof cv.QRCodeEncoder_CORRECT_LEVEL_H).toBe('number');
expect(typeof cv.QRCodeEncoder_CORRECT_LEVEL_L).toBe('number');
expect(typeof cv.QRCodeEncoder_CORRECT_LEVEL_M).toBe('number');

// Verify the values are different
expect(cv.QRCodeEncoder_CORRECT_LEVEL_L).not.toBe(cv.QRCodeEncoder_CORRECT_LEVEL_M);
expect(cv.QRCodeEncoder_CORRECT_LEVEL_M).not.toBe(cv.QRCodeEncoder_CORRECT_LEVEL_Q);
expect(cv.QRCodeEncoder_CORRECT_LEVEL_Q).not.toBe(cv.QRCodeEncoder_CORRECT_LEVEL_H);
});

it("should have encode mode constants", () => {
expect(typeof cv.QRCodeEncoder_MODE_AUTO).toBe('number');
expect(typeof cv.QRCodeEncoder_MODE_NUMERIC).toBe('number');
expect(typeof cv.QRCodeEncoder_MODE_ALPHANUMERIC).toBe('number');
expect(typeof cv.QRCodeEncoder_MODE_BYTE).toBe('number');
expect(typeof cv.QRCodeEncoder_MODE_KANJI).toBe('number');
expect(typeof cv.QRCodeEncoder_MODE_ECI).toBe('number');
expect(typeof cv.QRCodeEncoder_MODE_STRUCTURED_APPEND).toBe('number');
});

it("should have ECI encoding constants", () => {
expect(typeof cv.QRCodeEncoder_ECI_UTF8).toBe('number');
});

it("should have enum classes available", () => {
expect(typeof cv.QRCodeEncoder_CorrectionLevel).toBe('function');
expect(typeof cv.QRCodeEncoder_EncodeMode).toBe('function');
expect(typeof cv.QRCodeEncoder_ECIEncodings).toBe('function');

// Note: These are enum-like functions, not traditional constructors
// They exist but may not be instantiable in the expected way
});

// Note: QRCodeEncoder class itself is not available in the current OpenCV.js build
it("should document that QRCodeEncoder class is not available", () => {
// This test documents the current limitation
expect(typeof cv.QRCodeEncoder).toBe('undefined');

// The constants exist but the class doesn't
expect(typeof cv.QRCodeEncoder_CORRECT_LEVEL_Q).toBe('number');
});

it("should still have QRCodeDetector available for comparison", () => {
// QRCodeDetector should be available
expect(typeof cv.QRCodeDetector).toBe('function');
expect(() => new cv.QRCodeDetector()).not.toThrow();
});
});