gpt4 book ai didi

performance - OpenCV 中就地 RGB->BGR 颜色转换较慢

转载 作者:行者123 更新时间:2023-12-04 07:39:43 24 4
gpt4 key购买 nike

OpenCV 中的就地 RGB->BGR 颜色转换例程是否节省了一些内存,但需要更长的时间?如果是,谁能解释一下原因?
我的应用程序在 OpenCV(4.2.0 版)中调用 cv::cvtColor(srcMat, dstMat, cv::COLOR_RGB2BGR) 例程。为了使应用程序更快,我尝试了该例程的就地版本(通过使用源和目标的相同 Mat 对象调用它)。我预计速度会略有提高,因为就地版本不会分配新内存。
为了测试我的期望,我在超过 10,000 个 250x250 RGB 图像的循环中运行我的应用程序。令我惊讶的是,当使用就地版本时,我的应用程序变慢了。事实上,我看到图像越大(500x500 vs 250x250),就地版本和常规版本之间的差异就越大。
这是预期的吗?如果是这样,是不是因为就地版本进行了交换操作(更多语句)而常规版本只是复制操作?
有人愿意尝试重现这种行为吗?通过以两种不同的方式对以下代码段进行计时,可以轻松完成:1) 使用下面的代码段,以及 2) 按照就地版本代码段中的注释中的简要说明进行操作。

// Read image
Mat srcMat = imread(filename);

// Comment out this line for the in-place version
Mat dstMat;

for (int i=0; i<10000; i++)
{
// Use srcMat instead of dstMat in the in-place version
cv::cvtColor(srcMat, dstMat, cv::COLOR_RGB2BGR);
}
谢谢。

最佳答案

您可以挖掘来源以找到原因。
几乎没有可能的代码路径(是否使用 OpenCL,是否使用 IPP)。
在我的机器上执行 cv::cvtColor到达函数CvtColorIPPLoopCopycolor.hpp :

template <typename Cvt>
bool CvtColorIPPLoopCopy(const uchar * src_data, size_t src_step, int src_type, uchar * dst_data, size_t dst_step, int width, int height, const Cvt& cvt)
{
Mat temp;
Mat src(Size(width, height), src_type, const_cast<uchar*>(src_data), src_step);
Mat source = src;
if( src_data == dst_data )
{
src.copyTo(temp);
source = temp;
}
bool ok;
parallel_for_(Range(0, source.rows),
CvtColorIPPLoop_Invoker<Cvt>(source.data, source.step, dst_data, dst_step,
source.cols, cvt, &ok),
source.total()/(double)(1<<16) );
return ok;
}
代码检查是否 src_data == dst_data ,如果相等,则将源图像复制到临时图像中:
if( src_data == dst_data )
{
src.copyTo(temp);
source = temp;
}
额外的数据副本可能是就地处理需要较长时间的原因。

笔记:
我不能说这是肯定的原因,因为还有其他可能的代码路径。
有许多不支持“就地”处理的高性能优化函数。
当 OpenCV 需要执行不支持“就地”处理的函数时,解决方案可能是将源图像复制到临时位置。
相同的做法可用于其他执行代码路径。
正如我评论的那样,
由于循环携带的依赖关系,就地处理阻止了一些编译(和执行)优化。
在某些情况下,还存在关于“就地”处理的并行化问题。
这就是许多优化的“原始”函数不支持“就地”处理的原因。

关于performance - OpenCV 中就地 RGB->BGR 颜色转换较慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67550415/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com