为什么这个范围会爆炸
Why does this range blow up
为什么以下代码段有效
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);
相关文章:
- 为什么在全局范围内使用"extern int a"似乎不行?
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 关于:C++中异常对象的范围:为什么我没有得到副本?
- 为什么我的变量存在于其范围之外
- 为什么 gcc 会给我可能未初始化的警告 deque::insert 带有过滤范围
- 为什么范围算法与 std 的迭代器不兼容?
- 为什么这个正则表达式C++在括号表达式中抛出无效范围异常?
- 为什么 C++20 范围不只提供管道语法?
- 矢量超出范围,但为什么
- 为什么基于范围类型的大括号上循环init列表是非法的c++
- 为什么 gcc 警告只针对统一初始化缩小转换范围?
- 为什么基于范围的 for 循环中的结构化绑定只是一个副本而不是引用?
- 为什么当我的代码超出函数范围时,"does not name a type"出现编译器错误?
- 为什么我的 RLE 代码显示标准超出 C++ 的范围?
- 在遍历字符串时,为什么我没有超出范围错误,即使我已经超出了它的长度?
- 为什么不允许在全局命名空间处阻止范围?
- 为什么按位运算符在使用与整数中提供的位数相同的位数计算可能的最大范围时会产生错误
- 为什么C++找不到布尔运算符,当有一个!范围内的运算符?
- 将局部变量保存到全局向量中,为什么离开局部范围后可以得到这些局部变量?
- 为什么基于循环范围不直接在C 中使用参数阵列