乐闻世界logo
搜索文章和话题

OpenCV.js 中的 Mat 对象是什么,如何创建和管理?

2026年3月7日 12:25

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();

内存管理注意事项

  1. 手动释放:JavaScript 没有自动垃圾回收机制,必须手动调用 delete() 释放内存
  2. 避免内存泄漏:在不再使用 Mat 时立即释放
  3. 使用 try-finally:确保异常情况下也能释放资源
javascript
try { 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 } }
标签:Opencv.js