OpenCV中的原位RGB to BGR转换例程是否节省了一些内存,但需要更长的时间?如果是的话,有人可以解释一下吗?
我的应用程序调用了OpenCV(版本4.2.0)中的cv :: cvtColor(srcMat,dstMat,cv :: COLOR_RGB2BGR)例程。为了使应用程序更快,我尝试过这个例程的原位版本(通过使用相同的Mat对象作为源和目标进行调用)。我希望速度稍微提高,因为原位版本不会分配新的内存。
为了测试我的期望,我对10,000个250x250的RGB图像进行了循环测试。令我惊讶的是,在使用原位版本时,我的应用程序变得更慢了。事实上,我发现图像越大(500x500与250x250相比),原位版本与常规版本之间的差异就越大。
这是预期的吗?如果是这样,是因为原位版本执行了一次交换操作(更多语句),而常规版本只是一个复制操作吗?
愿意尝试再现这种行为的人会是谁?可以通过计时以下代码段两种方式来轻松地完成:1)使用下面的代码段,以及2)按照代码段中的简要说明进行原地版本的计时。
谢谢。
我的应用程序调用了OpenCV(版本4.2.0)中的cv :: cvtColor(srcMat,dstMat,cv :: COLOR_RGB2BGR)例程。为了使应用程序更快,我尝试过这个例程的原位版本(通过使用相同的Mat对象作为源和目标进行调用)。我希望速度稍微提高,因为原位版本不会分配新的内存。
为了测试我的期望,我对10,000个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
,并将其用作cvtColor
的目标,而不是直接在原地进行操作。只要目标具有正确的数据类型和大小,它就不会被重新分配。通常情况下都是如此,额外的内存不太可能成为关键问题。|哦,32个并行,我想在这种情况下它可能更重要一些 :) - Dan Mašek