JavaScript中如何将OpenCV.Mat转为数组并像二维数组一样访问
OpenCV.js Mat对象元素访问方案
Mat初始化注意事项
cv.matFromArray不支持直接传入二维JavaScript数组创建Mat,必须传入拍平后的一维数组才能得到正确结果。
正确初始化示例:// 创建3行3列、64位浮点型的Mat对象 const myMat = cv.matFromArray(3, 3, cv.CV_64F, [1,2,3,4,5,6,7,8,9])
单个元素访问方法
- OpenCV.js的Mat原生不支持
mat[row][col]这种二维数组下标访问语法,需要根据Mat存储的数据类型,调用对应的xxxAt方法,传入行、列索引即可获取指定位置的元素值。
不同数据类型对应的取值方法:cv.CV_8U(8位无符号整型):mat.ucharAt(row, col)cv.CV_8S(8位有符号整型):mat.charAt(row, col)cv.CV_16U(16位无符号整型):mat.ushortAt(row, col)cv.CV_16S(16位有符号整型):mat.shortAt(row, col)cv.CV_32S(32位整型):mat.intAt(row, col)cv.CV_32F(32位浮点型):mat.floatAt(row, col)cv.CV_64F(64位浮点型):mat.doubleAt(row, col)
访问示例:
const newMat = someProcessThatReturnMat(myMat) // 读取第1行第2列、第2行第0列的元素参与计算 const result = someProcess(newMat.doubleAt(1, 2), newMat.doubleAt(2, 0))
批量元素访问优化
如果需要批量遍历、操作大量Mat元素,反复调用
xxxAt方法性能较差,可以直接获取Mat对应的底层类型化数组,自行计算偏移量访问,性能接近原生数组操作。
以单通道cv.CV_64F类型Mat为例:
// 获取Mat对应的Float64Array类型视图 const data = myMat.data64F const cols = myMat.cols // 访问第r行第c列的元素 const r = 1, c = 2 const value = data[r * cols + c]
内容的提问来源于stack exchange,提问作者2Divide3
相关产品推荐
相关产品推荐

