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
变量而无需额外的副本。
我需要将内核从一个通道扩展到多个通道。例如来自
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
变量而无需额外的副本。