OpenCV.js 中的 Mat(Matrix)是最核心的数据结构,用于存储图像和矩阵数据。
Mat 的基本概念
Mat 是一个 n 维数组,可以存储:
- 单通道或多通道图像(灰度、RGB、RGBA)
- 矩阵数据
- 其他数值类型的数据
创建 Mat 对象
javascript// 创建空 Mat let mat = new cv.Mat(); // 创建指定大小的 Mat(默认黑色) let mat = new cv.Mat(rows, cols, type); // 常用类型 cv.CV_8UC1 // 8位无符号单通道(灰度图) cv.CV_8UC3 // 8位无符号三通道(RGB图) cv.CV_8UC4 // 8位无符号四通道(RGBA图) cv.CV_32FC1 // 32位浮点单通道
从 HTML 元素创建 Mat
javascript// 从 canvas 创建 let canvas = document.getElementById('canvas'); let mat = cv.imread(canvas); // 从 img 元素创建 let img = document.getElementById('image'); let mat = cv.imread(img);
Mat 的常用操作
javascript// 读取和设置像素值 let pixel = mat.ucharAt(row, col); // 读取单通道像素 let pixel = mat.data; // 获取所有像素数据 // 复制 Mat let matCopy = mat.clone(); // 创建感兴趣区域(ROI) let roi = mat.roi(new cv.Rect(x, y, width, height)); // 转换颜色空间 cv.cvtColor(mat, mat, cv.COLOR_RGBA2GRAY); // 释放内存 mat.delete();
内存管理注意事项
- 手动释放:JavaScript 没有自动垃圾回收机制,必须手动调用
delete()释放内存 - 避免内存泄漏:在不再使用 Mat 时立即释放
- 使用 try-finally:确保异常情况下也能释放资源
javascripttry { let mat = new cv.Mat(100, 100, cv.CV_8UC3); // 处理图像 } finally { mat.delete(); }
常见错误
javascript// 错误:忘记释放内存导致内存泄漏 let mat = new cv.Mat(); // 使用后没有调用 mat.delete() // 错误:重复释放 mat.delete(); mat.delete(); // 会抛出错误 // 正确:使用智能指针模式 function processImage() { let mat = new cv.Mat(); try { // 处理逻辑 return mat.clone(); // 返回副本 } finally { mat.delete(); // 释放原始 Mat } }