c++ - 为什么这个范围会爆炸

标签 c++ opencv

为什么下面的代码段有效

int sizearray[3] = {3,4,2};
Mat OneM = Mat::ones(3,4,CV_8UC1);  
Mat TwoM = Mat::ones(3,4,CV_8UC1)+1; 
Mat OneTwo3D = Mat::zeros(3,sizearray,CV_8UC1);
Mat OneTwo3DPlaneM;
Range OneTwo3DRanges[] = {Range(1,3),Range(1,4),Range(1,2)};
OneTwo3DPlaneM = OneTwo3D(OneTwo3DRanges);

但如果我将范围更改为

Range OneTwo3DRanges[] = {Range(1,4),Range(1,4),Range(1,2)};

它爆炸了。

在工作中,OneTwo3DPlaneM 显然是预期的 2x3x1 矩阵,因为 Range 的“结束”是排他的(通过查看工作代码确认/范围结果 OneTwo3DPlaneM.size.p[2,3,1])。但是,仅将第一个范围从 Range(1,3) 增加到 Range(1,4) 会导致

错误
OneTwo3DPlaneM = OneTwo3D(OneTwo3DRanges);

请注意,我最终要做的是将图像分配到 3d 数组的切片中(我认为是通过 OneM.copyTo(OneTwo3DPlaneM))。上面的代码只是对此的测试。所以,我只想创建一个引用平面 OneTwo3D 的矩阵,以便在这个测试中,我可以将矩阵 OneM 分配给第一个平面,最终,TwoM 到第二个平面(在我将第三个范围更改为指向 OneTwo3D 的第二个平面之后)

鉴于我对 opencv 没有太多经验,我认为我正在做一些弱智。预先道歉。

最佳答案

下面的代码似乎有效 显然,copyTo 不喜欢从 2d 分配到 3d 数组的一部分。因此,如下所示,我将 OneM 和 TwoM 从 3x4 矩阵更改为 3x4x1,然后它起作用了。我想问题是给出了一个图像(2d),我可以将它 reshape 为一个 3d 实体,具有单例第 3 维,以便 copyTo 快乐。考虑到 reshape 仅适用于二维数组,我不确定该怎么做。

int sizearray1[3] = {3,4,1};
int sizearray[3] = {3,4,2};
//      Mat OneM = Mat::ones(3,4,CV_8UC1);  
Mat OneM = Mat::ones(3,sizearray1,CV_8UC1);  
//      Mat TwoM = Mat::ones(3,4,CV_8UC1)+1;  
Mat TwoM = Mat::ones(3,sizearray1,CV_8UC1)+1;  
Mat OneTwo3D = Mat::zeros(3,sizearray,CV_8UC1);
Mat OneTwo3DPlaneM;
Range OneTwo3DRanges[] = {Range::all(),Range::all(),Range(0,1)};
OneTwo3DPlaneM = OneTwo3D(OneTwo3DRanges);
OneM.copyTo(OneTwo3DPlaneM);
OneTwo3DRanges[2] = Range(1,2);
OneTwo3DPlaneM = OneTwo3D(OneTwo3DRanges);
TwoM.copyTo(OneTwo3DPlaneM);

关于c++ - 为什么这个范围会爆炸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28248390/

相关文章:

c++ - 如何组合两个查询并将第一个查询的结果用作第二个查询的输出

android - 在 X-Cross 平台库上使用 JsonCpp

python - DICT4X4 中的 ArUco 标记检测良好,但 DICT5x5 中的检测不佳

python - 高效计算 Sobel 梯度幅值

c++ - bit blit 在 GDI 中是如何工作的?

c++ - C++ 中的字符串到字节或 Char*

c++ - 确定参数的数量和类型以及作为函数的类型参数的返回类型

python - 计算图像两半的像素比

image-processing - 读取 RGBA 图像 OpenCV

c++ - opencv相机标定(Assertion failed故障)