OpenCV:OutputArray用法,不带副本

OpenCV: OutputArray usage without copy

本文关键字:副本 用法 OutputArray OpenCV      更新时间:2023-10-16

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

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

遵循标准三通道CCD_ 1。

我有以下代码:

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);
}

基于CCD_ 3,一个通道内核被复制到CCD_。然后创建一个多信道CCD_ 4。

我的问题是关于最后一行kernel.copyTo(_kernel)。在我看到的许多例子中,这就是如何处理Outputarray的方法。真的需要这个copyTo吗?在我看来,将已经计算好的kernel复制到_kernel是在浪费内存和时间。没有这种数据从一个结构复制到另一个结构的解决方案吗?

我的问题与OpenCV和提到的结构密切相关。

提前谢谢。

在您的特定情况下,您可以将cv::Mat0变量直接传递给merge调用,以避免不必要的复制:

merge(channels, _kernel)

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

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

现在可以在没有额外副本的情况下填充outMat变量。