Mat (Matrix) is the core data structure in OpenCV.js, used to store image and matrix data.
Basic Concepts of Mat
Mat is an n-dimensional array that can store:
- Single or multi-channel images (grayscale, RGB, RGBA)
- Matrix data
- Other numeric data types
Creating Mat Objects
javascript// Create empty Mat let mat = new cv.Mat(); // Create Mat with specified size (default black) let mat = new cv.Mat(rows, cols, type); // Common types cv.CV_8UC1 // 8-bit unsigned single channel (grayscale) cv.CV_8UC3 // 8-bit unsigned three channels (RGB) cv.CV_8UC4 // 8-bit unsigned four channels (RGBA) cv.CV_32FC1 // 32-bit float single channel
Creating Mat from HTML Elements
javascript// Create from canvas let canvas = document.getElementById('canvas'); let mat = cv.imread(canvas); // Create from img element let img = document.getElementById('image'); let mat = cv.imread(img);
Common Mat Operations
javascript// Read and set pixel values let pixel = mat.ucharAt(row, col); // Read single channel pixel let pixel = mat.data; // Get all pixel data // Copy Mat let matCopy = mat.clone(); // Create Region of Interest (ROI) let roi = mat.roi(new cv.Rect(x, y, width, height)); // Convert color space cv.cvtColor(mat, mat, cv.COLOR_RGBA2GRAY); // Release memory mat.delete();
Memory Management Considerations
- Manual Release: JavaScript doesn't have automatic garbage collection, so you must manually call
delete()to release memory - Avoid Memory Leaks: Release memory immediately when Mat is no longer needed
- Use try-finally: Ensure resources are released even in exceptional cases
javascripttry { let mat = new cv.Mat(100, 100, cv.CV_8UC3); // Process image } finally { mat.delete(); }
Common Errors
javascript// Error: Memory leak due to forgetting to release let mat = new cv.Mat(); // No mat.delete() called after use // Error: Double release mat.delete(); mat.delete(); // Will throw error // Correct: Using smart pointer pattern function processImage() { let mat = new cv.Mat(); try { // Processing logic return mat.clone(); // Return copy } finally { mat.delete(); // Release original Mat } }