Performance 就地RGB->;OpenCV中的BGR颜色转换较慢

Performance 就地RGB->;OpenCV中的BGR颜色转换较慢,performance,opencv,memory,in-place,Performance,Opencv,Memory,In Place,OpenCV中的就地RGB->BGR颜色转换例程是否会节省一些内存,但需要更长的时间?如果是,有人能解释原因吗 我的应用程序在OpenCV(版本4.2.0)中调用cv::cvtColor(srcMat、dstMat、cv::COLOR_RGB2BGR)例程。为了使应用程序更快,我尝试了这个例程的就地版本(通过使用源和目标的相同Mat对象调用它)。我预计速度会略有提高,因为就地版本不分配新内存 为了测试我的期望,我在10000张250x250 RGB图像上循环运行了我的应用程序。令我惊讶的是,当使

OpenCV中的就地RGB->BGR颜色转换例程是否会节省一些内存,但需要更长的时间?如果是,有人能解释原因吗

我的应用程序在OpenCV(版本4.2.0)中调用cv::cvtColor(srcMat、dstMat、cv::COLOR_RGB2BGR)例程。为了使应用程序更快,我尝试了这个例程的就地版本(通过使用源和目标的相同Mat对象调用它)。我预计速度会略有提高,因为就地版本不分配新内存

为了测试我的期望,我在10000张250x250 RGB图像上循环运行了我的应用程序。令我惊讶的是,当使用就地版本时,我的应用程序速度变慢了。事实上,我看到图像越大(500x500对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);
}
//读取图像
Mat srcMat=imread(文件名);
//注释掉这一行的就地版本
Mat-dstMat;

对于(inti=0;i,您可以挖掘来源以找到原因

几乎没有可能的代码路径(是否使用OpenCL,是否使用IPP)。
在我的机器中,
cv::cvtColor
的执行到达以下位置的函数
CvtColorIPPLoopCopy

模板
bool-cvtcolopploopcopy(常量uchar*src_数据、大小src_步长、int-src_类型、uchar*dst_数据、大小dst_步长、int-width、int-height、常量Cvt&Cvt)
{
垫温;
材料型钢混凝土(尺寸(宽度、高度)、型钢混凝土类型、混凝土浇筑(型钢混凝土数据)、型钢混凝土台阶);
Mat source=src;
if(src_数据==dst_数据)
{
src.copyTo(临时);
源=温度;
}
布尔ok;
_u的并行_(范围(0,source.rows),
CVTColoppLoop_调用程序(source.data、source.step、dst_数据、dst_步骤、,
source.cols、cvt和ok),

source.total()/(double)(1您在什么CPU上,甚至在操作系统上遇到了这种情况?您使用的是哪种OpenCV版本?|好问题,但很难回答。CPU:Intel(R)Xeon(R)CPU E5-2450 v2@2.50GHz。它有16个超线程内核。我的应用程序运行32个线程,每个线程(并行)线程处理单个映像。OS:Unix。使用ICC编译器优化构建OpenCV。我猜这是某种处理循环中的操作。在这种情况下,我只需要一个在迭代中持续存在的
Mat
,并将其用于
cvtColor
的目标。只要目标有正确的数据类型和大小,它不会被重新分配。通常情况下,这种情况下,额外的内存不太可能是关键的。|哦,其中32个是并行的,我想在这种情况下可能更重要:)就地处理会阻止一些编译(和执行)优化是由于。我不能说这是这里的解释,但它可能是。@DanMašek接下来,我现在尝试了一个目标矩阵,它在迭代中保持不变。这个新版本的性能比就地版本更好(其中srcMat和dstMat是相同的),但仍比常规版本稍差。我仍在研究所有这些,但到目前为止,似乎不为目标矩阵分配内存并不能提高性能。