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

  1. Manual Release: JavaScript doesn't have automatic garbage collection, so you must manually call delete() to release memory
  2. Avoid Memory Leaks: Release memory immediately when Mat is no longer needed
  3. Use try-finally: Ensure resources are released even in exceptional cases
javascript
try { 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 } }
标签:Opencv.js