我需要将内核从一个通道扩展到更多通道。例如来自
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
遵循标准的三个通道
cv::Mat
。我有以下代码:
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);
}
根据
std:vector
,将一个通道内核多次复制到chn
。之后,创建一个多通道cv::Mat
。我的问题是关于最后一行
kernel.copyTo(_kernel)
。在我所看到的许多示例中,这就是如何处理Outputarray
的方法。真的需要这个copyTo
吗?在我看来,浪费内存和时间将已经计算出的kernel
复制到_kernel
。没有这种将数据从一个结构复制到另一个结构的解决方案吗?我的问题与OpenCV和提到的结构严格相关。
提前致谢。
最佳答案
在您的特定情况下,您可以直接将_kernel
变量传递给merge
调用,以避免不必要的复制:
merge(channels, _kernel)
在一般情况下,应按以下方式使用
OutputArray
对象:_outArr.create(size, type);
Mat outMat = _outArr.getMat();
现在,无需额外的副本即可填充
outMat
变量。关于c++ - OpenCV:OutputArray用法,无拷贝,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29184804/