Я использую cv :: matchTemplate для отслеживания движущегося объекта в видео.
Тем не менее, выполнение сопоставления с шаблоном open cv с маленькой картинкой может быть медленнее на более качественном / новом процессоре Intel. Приведенный ниже фрагмент кода обычно выполняется в 2 раза медленнее на i9-7920x (0,28 мс / матч), чем на i7-9700k (0,14 мс / матч).
#include <chrono>
#include <fstream>
#include <opencv2/opencv.hpp>
#pragma optimize("", off)
int main()
{
cv::Mat haystack;
cv::Mat needle;
cv::Mat result;
cv::Rect rect;
//https://en.wikipedia.org/wiki/Barack_Obama#/media/File:President_Barack_Obama.jpg
haystack = cv::imread("C:/President_Barack_Obama.jpg");
rect.width = 64;
rect.height = 64;
haystack = haystack(rect);
rect.width = 12;
rect.height = 12;
rect.x = 50;
rect.y = 50;
needle = haystack(rect);
auto start = std::chrono::high_resolution_clock::now();
int nbmatch = 10000;
for (int i = 0; i < nbmatch; i++) {
cv::matchTemplate(haystack, needle, result, cv::TemplateMatchModes::TM_CCOEFF_NORMED);
}
auto end = std::chrono::high_resolution_clock::now();
std::chrono::duration<double> diff = end - start;
std::cout << "time per match: " << (diff.count() / nbmatch) * 1000 << " ms\n";
std::this_thread::sleep_for(std::chrono::seconds(500));
}
В моем реальном приложении я заметил следующее:
- i7-9700k: 1 мс;
- i7-6800k: 1,3 мс;
- i9-7920x: 2,8 мс;
- i9-9820x : 2.8 мс.
Оба i9 медленнее из-за значительной суммы, которая не может быть объяснена небольшой разницей в тактовой частоте.
Победа 7 или 10 не имеет значения , Он скомпилирован с Visual Studio 2019 (v142). Открытое резюме скомпилировано из исходного кода с помощью предварительно собранных библиотек (сборка сама по себе не помогла).
Редактировать : способность масштабировать частоту, по-видимому, важна влияние. Если запущен однопоточный, i9-7920x по-прежнему работает за 2,8 мс, если я регулярно сплю, но если я уступаю (загрузка процессора 100%), он понижается до 1,9 мс.
Вопрос:
Чем это можно объяснить?
Как вы думаете, можно ли перевести все процессоры в один и тот же интервал времени, используя cv :: matchTemplate?
Что можно сделать еще, чтобы уменьшить мое время вычислений?