OpenCV初始化3D Mat失败求助:创建rows×cols×16维度矩阵遇异常
解决OpenCV 3D Mat初始化错误的问题
嘿,我来帮你搞定这个3D矩阵初始化的坑!你遇到的问题其实是对OpenCV中Mat的维度定义理解有点偏差,咱们一步步理清楚:
问题根源
你写的代码Mat::zeros(rows, cols, CV_32FC(16))并不是在创建3D矩阵,而是创建了一个2D矩阵,每个像素包含16个32位浮点通道。这时候矩阵的实际维度还是2D(rows×cols),而不是你想要的rows×cols×16的三维结构。当你尝试去读取第三个维度的时候,自然会得到异常值(比如-858993460,这是未初始化内存的典型表现)。
正确的3D Mat创建方式
要创建真正的三维矩阵,你需要用OpenCV支持的三维尺寸定义方式,具体步骤如下:
- 定义三维尺寸的数组:用
vector<int>来存储三个维度的大小(行、列、深度) - 用这个尺寸数组初始化
Mat,指定数据类型和初始值
示例代码:
Mat image_Conv; int rows = imageBicubic.rows; int cols = imageBicubic.cols; // 定义三维尺寸:行、列、深度(这里是16) vector<int> sizes = {rows, cols, 16}; // 创建全零的3D矩阵,数据类型为32位浮点 image_Conv = Mat(sizes, CV_32F, Scalar::all(0));
验证矩阵维度是否正确
对于3D Mat,不要用常规的rows和cols属性来获取维度(这些是为2D矩阵设计的),应该通过size数组访问三个维度:
// 打印三个维度的大小 cout << "3D矩阵尺寸:" << image_Conv.size[0] << " × " << image_Conv.size[1] << " × " << image_Conv.size[2] << endl;
这样就能正确输出你想要的rows×cols×16了。
内容的提问来源于stack exchange,提问作者Philippine Prevost
相关产品推荐
相关产品推荐

