为什么这个范围会爆炸

Why does this range blow up

本文关键字:范围 为什么      更新时间:2023-10-16

为什么以下代码段有效

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 arrray 的一部分中(我认为是通过 OneM.copyTo(OneTwo3DPlaneM))。 上面的代码只是一个测试。 所以,我只想创建一个引用平面OneTwo3D矩阵,以便对于此测试,我可以将矩阵OneM分配给第一个平面,并最终TwoM分配给第二个平面(在我更改第三个范围以指向OneTwo3D的第二个平面之后)

鉴于我对opencv没有太多经验,我认为我正在做一些迟钝的事情。提前道歉。

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

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);
相关文章: