如何在OpenCV C++中为cv::Mat设置自定义步长采样数组元素?
解决OpenCV cv::Mat跳步采样数组的问题
要实现从float数组中每隔3个元素采样并创建cv::Mat,核心是正确使用构造函数的step参数,注意以下两点:
- step参数的单位是字节:你需要将元素间隔转换为字节数,而非元素个数。每个float占4字节,每隔3个元素采样意味着相邻元素的字节偏移是
3 * sizeof(float)(即12字节)。 - Mat的列数要匹配预期采样的元素数量:你的示例中预期输出4个元素,因此Mat的列数应设为4,而非3。
正确代码示例
#include <opencv2/opencv.hpp> #include <iostream> int main() { float arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // 构造1行4列的Mat,step设置为3个float的字节数 cv::Mat mat(1, 4, CV_32F, arr, 3 * sizeof(float)); std::cout << mat << "\n"; // 输出:[1, 4, 7, 10] return 0; }
关键说明
- 浅拷贝注意事项:通过这种方式创建的Mat是对原数组的浅引用,原数组的生命周期必须长于Mat对象,否则会导致内存访问错误。如果需要独立的Mat副本,可以调用
mat.clone()生成深拷贝。 - step的本质:对于1维Mat,
step指定了相邻元素之间的字节跨度;对于多维Mat,step[i]表示第i维的总字节数。这里仅需设置1维的step即可实现跳步采样。
内容的提问来源于stack exchange,提问作者BHOS
相关产品推荐
相关产品推荐

