如何在OpenCV中通过索引Mat访问另一矩阵数据?
Efficient Way to Index OpenCV Mat Using Another Index Mat
绝对别用手动循环!OpenCV有好几种更高效的向量式操作,完全不用逐元素遍历,性能提升特别明显,尤其是数据量上去的时候。我给你介绍两种最常用的方法:
方法1:直接利用矩阵索引重载
因为你的A和B本来就是1×100的一维矩阵,直接用OpenCV的矩阵索引重载就能一步到位:
// 确保矩阵是一维连续的(你的输入已经满足,但reshape是个保险操作) cv::Mat A_flat = A.reshape(1, 1); cv::Mat B_flat = B.reshape(1, 1); // 直接提取对应索引的元素,结果和B维度一致 cv::Mat result = A_flat(B_flat);
这个操作底层是OpenCV优化过的,会自动用SIMD指令(比如SSE/AVX)批量处理元素,比你手写循环快太多了——毕竟手动循环不仅有循环开销,还吃不到这些底层优化。
方法2:用查找表(LUT)适合小范围索引
如果你的索引值范围不大(比如这里是0-99),用cv::LUT也很方便:
// 把A转成查找表,这里假设A是CV_32F类型,先把lut初始化足够大 cv::Mat lut = cv::Mat::zeros(256, 1, A.type()); // 把A的元素复制到查找表的对应位置 A.copyTo(lut.rowRange(0, A.cols)); // 直接通过LUT映射得到结果 cv::Mat result; cv::LUT(B, lut, result);
不过这个方法更适合索引值不超过255的场景,要是你以后处理更大的矩阵,方法1会更通用。
额外注意点
- 一定要保证B里的索引是有效的,不能超出A的列范围(这里就是0到99),不然会触发越界错误
- 如果你的Mat是某个大矩阵的子矩阵(非连续存储),最好先调用
clone()转成连续矩阵,避免内存访问的额外开销
内容的提问来源于stack exchange,提问作者BossShell
相关产品推荐
相关产品推荐

