我需要将内核从一个通道扩展到更多通道。例如来自
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严格相关,并提到了结构。
提前致谢。
答案 0 :(得分:4)
在您的具体情况下,您可以将_kernel
变量直接传递给merge
,以避免无效副本:
merge(channels, _kernel)
一般情况下,OutputArray
对象应该按以下方式使用:
_outArr.create(size, type);
Mat outMat = _outArr.getMat();
现在可以填充outMat
变量而无需额外的副本。