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

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/

10-10 22:48