为什么这个范围会爆炸

时间:2015-01-31 05:09:09

标签: 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的“结束”是独占的(通过查看工作代码/范围结果{{1}确认)这是OneTwo3DPlaneM.size.p)。但是,只是将第一个范围从[2,3,1]增加到Range(1,3)会导致错误

Range(1,4)

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

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

1 个答案:

答案 0 :(得分:0)

下面的代码似乎工作显然,copyTo并不喜欢从2d分配到3d数组的切片。因此,如下所示,我将OneM和TwoM从3x4矩阵更改为3x4x1,然后就可以了。我想这个问题给出了一个图像(2d)我可以将它重塑为具有单个第三维的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);