为什么以下代码段有效
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没有太多经验,我认为我正在做一些迟钝的事情。道歉。
答案 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);