openCV cv :: matchTemplate работает в два раза медленнее на процессоре Intel «лучше / новее» - PullRequest
0 голосов
/ 06 февраля 2020

Я использую 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?

Что можно сделать еще, чтобы уменьшить мое время вычислений?

...