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

以下标准三个通道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);
}

根据chn,将一个通道内核复制到std:vector 次。之后是一个多通道 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变量而无需额外的副本。