You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 22:54:37