gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 13:39:37 25 4
gpt4 key购买 nike

为什么下面的代码段有效

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/

25 4 0
文章推荐: javascript - 使用 JavaScript 显示另一个 div 时隐藏一个 div
文章推荐: php - 通过 jQuery ajax 发送的内容被截断
文章推荐: javascript - 无论如何要将 <title> 链接到
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com