OpenCV:没有副本的OutputArray用法

时间:2015-03-21 16:03:07

标签: c++ opencv image-processing

我需要将内核从一个通道扩展到更多通道。例如来自

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严格相关,并提到了结构。

提前致谢。

1 个答案:

答案 0 :(得分:4)

在您的具体情况下,您可以将_kernel变量直接传递给merge,以避免无效副本:

merge(channels, _kernel)

一般情况下,OutputArray对象应该按以下方式使用:

_outArr.create(size, type);
Mat outMat = _outArr.getMat();

现在可以填充outMat变量而无需额外的副本。