Дело в том, что процедура преобразования цветов RGB->BGR на месте в OpenCV экономит память, но занимает больше времени? Если да, то может ли кто-нибудь объяснить, почему?
Мое приложение вызывает процедуру cv::cvtColor(srcMat, dstMat, cv::COLOR_RGB2BGR) в OpenCV (версия 4.2.0). Чтобы сделать приложение быстрее, я попробовал версию этой подпрограммы на месте (вызвав ее с одним и тем же объектом Mat для источника и назначения). Я ожидал, что скорость немного улучшится, так как версия на месте не выделяет новую память.
Чтобы проверить свои ожидания, я запустил свое приложение в цикле на 10 000 изображений RGB 250x250. К моему удивлению, мое приложение стало медленнее, когда использовалась версия на месте. На самом деле я увидел, что чем больше изображение (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 из них параллельно, я думаю, это может иметь большее значение в этом сценарии :) - person Dan Mašek   schedule 15.05.2021