3月7日 12:25
What is the Mat object in OpenCV.js and how to create and manage it?
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 } }