OpenCV:OutputArray用法,不带副本
OpenCV: OutputArray usage without copy
我需要将内核从一个通道扩展到多个通道。例如
0 1 0
1 -4 1
0 1 0
至
0 0 0 1 1 1 0 0 0
1 1 1 -4 -4 -4 1 1 1
0 0 0 1 1 1 0 0 0
遵循标准三通道CCD_ 1。
我有以下代码:
void createKernel(InputArray _A, InputArray _B, OutputArray _kernel, const int chn)
{
Mat A = _A.getMat();
Mat B = _B.getMat();
Mat kernel;
Mat kernelOneChannel = A * B;
std::vector<Mat> channels;
for (int i = 0; i < chn; i++)
{
channels.push_back(kernelOneChannel);
}
merge(channels, kernel);
kernel.copyTo(_kernel);
}
基于CCD_ 3,一个通道内核被复制到CCD_。然后创建一个多信道CCD_ 4。
我的问题是关于最后一行kernel.copyTo(_kernel)
。在我看到的许多例子中,这就是如何处理Outputarray
的方法。真的需要这个copyTo
吗?在我看来,将已经计算好的kernel
复制到_kernel
是在浪费内存和时间。没有这种数据从一个结构复制到另一个结构的解决方案吗?
我的问题与OpenCV和提到的结构密切相关。
提前谢谢。
在您的特定情况下,您可以将cv::Mat
0变量直接传递给merge
调用,以避免不必要的复制:
merge(channels, _kernel)
在一般情况下,OutputArray
对象应该以以下方式使用:
_outArr.create(size, type);
Mat outMat = _outArr.getMat();
现在可以在没有额外副本的情况下填充outMat
变量。
相关文章:
- 这个指针在c++中的用法
- 用callgrind追踪不必要的副本
- 关于:C++中异常对象的范围:为什么我没有得到副本?
- 在为LINUX创建共享库时,如何避免STL的私有/弱副本
- 检查注册表项是否链接到(或副本)另一个注册表项
- 当C++中需要自动删除时,这是静态的正确用法吗?
- libstdc++ 文件系统中未初始化的用法?
- 复制和交换习惯用法与移动操作之间的交互
- 为什么构建目录中新构建的共享库与安装目录中的副本具有不同的依赖项集?
- 类作用域的类型别名"using":[何时]方法中的用法可以先于类型别名?
- 命名参数习惯用法和(抽象)基类
- C++基于范围的 for 循环和元素副本
- 省略号在C++中的所有用法
- () 在 C++ 11 中的特殊而奇怪的用法?
- 创建提升::shared_ptr的深层副本
- 构造函数的用法
- 如何从构造函数副本 T(const T&)调用对象 T?
- 副本初始化的默认模板参数推导
- 副本交换习惯用法的有效性
- OpenCV:OutputArray用法,不带副本