为何OpenCV.js中Mat.roi返回连续数据而非矩形子矩阵?
OpenCV.js 获取ROI时data输出不符合预期的问题
问题根源
你直接打印Mat.data的方式有误,data是原Mat内存缓冲区的视图,不会自动适配ROI的行步长,导致输出看起来不符合预期。
原因详解
你的原Mat是3x3的行优先存储,内存中数据为[1,2,3,4,5,6,7,8,9]。创建Rect(1,1,2,2)的ROI时:
- 左上角是列索引1,行索引1(OpenCV的
Rect参数为x(列), y(行), width, height,索引从0开始) - 理论上ROI应包含第1行的5、6,第2行的8、9
但numRoi.data会从原Mat的起始偏移位置(1*3+1=4,对应值5)开始,直接取连续4个元素,也就是5,6,7,8——这是因为原Mat每行有3个元素,ROI每行仅取2个,data不会自动跳过每行末尾的1个元素。
正确验证方法
不要直接打印data,遍历ROI的行和列获取值:
// 遍历ROI的行与列 for (let y = 0; y < numRoi.rows; y++) { const currentRow = []; for (let x = 0; x < numRoi.cols; x++) { currentRow.push(numRoi.ucharAt(y, x)); } console.log(currentRow.join(' ')); }
执行后会输出预期结果:
5 6 8 9
额外处理方案
如果需要得到连续的正确数据,可以克隆ROI为独立矩阵:
const clonedRoi = numRoi.clone(); console.log(Array.from(clonedRoi.data)); // 输出 [5,6,8,9]
内容的提问来源于stack exchange,提问作者Tin
相关产品推荐
相关产品推荐

