Как оптимизировать код соответствия opencv?

#c #opencv

Вопрос:

Приложение использует winapi и библиотеку opencv. Приложение в режиме реального времени получает другой экран приложения и сопоставляет какое-либо изображение или обнаруживает, что определенная область прямоугольника имеет определенный цвет. Приложение работает со скоростью не более 60 кадров в секунду.

приложение потребляет много ресурсов процессора от 3% до 10% после того, как я добавил matchTemplate. мой процессор Intel i5-9400F(6 ядер)

как оптимизировать эту таблицу соответствия?

 #include <Windows.h>
#include <opencv2/opencv.hpp>

int main()
{
    while(true)
    {
        RECT rect;
        void* pBitmapPixels;
        const wchar_t* wndName = L"NoxPlayer";
        HWND hWnd = FindWindowExW(NULL, NULL, NULL, wndName);
        HDC hdc = GetDC(hWnd);
        HDC memoryHDC = CreateCompatibleDC(hdc);

        GetClientRect(WindowFromDC(hdc), amp;rect);

        BITMAPINFO bitmapInfo;
        ZeroMemory(amp;bitmapInfo, sizeof(BITMAPINFO));
        bitmapInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
        bitmapInfo.bmiHeader.biWidth = rect.right;
        bitmapInfo.bmiHeader.biHeight = -(rect.bottom);
        bitmapInfo.bmiHeader.biPlanes = 1;
        bitmapInfo.bmiHeader.biBitCount = 32;
        HBITMAP hBitmap = CreateDIBSection(hdc, amp;bitmapInfo, DIB_RGB_COLORS, amp;pBitmapPixels, NULL, 0);

        SelectObject(memoryHDC, hBitmap);

        cv::Mat screenShot = cv::Mat(rect.bottom, rect.right, CV_8UC4, pBitmapPixels, 0);

        BitBlt(memoryHDC, 0, 0, rect.right, rect.bottom, hdc, 0, 0, SRCCOPY);

        cv::Mat templ, temptImg, resu<
        cv::Point minLoc;

        cv::cvtColor(screenShot, temptImg, cv::COLOR_BGR2GRAY);
        templ = cv::imread("search.png", cv::IMREAD_GRAYSCALE);

        cv::matchTemplate(temptImg, templ, result, cv::TM_SQDIFF);
        cv::minMaxLoc(result, NULL, NULL, amp;minLoc, NULL);

        cv::rectangle(screenShot, minLoc, cv::Point(minLoc.x   templ.cols, minLoc.y   templ.rows), cv::Scalar(0,255,0), 2);

        cv::imshow("Result", screenShot);

        cv::waitKey(16.6);  

        DeleteObject(hBitmap);
        ReleaseDC(hWnd, memoryHDC);
        ReleaseDC(hWnd, hdc);
        DeleteDC(memoryHDC);
        DeleteDC(hdc);    
    };
 return 0;
}
 

Комментарии:

1. Попробуй что-нибудь другое cv::TemplateMatchModes . Все они выглядят довольно дорого, но, возможно, вы можете посмотреть на формулы и найти более дешевый.

2. @TedLyngmo, с вашей точки зрения, какой из них самый дешевый?

3. я прочитал файл search.png только один раз, вне цикла, и вышел за рамки любого другого вида инициализации. И запустить в выпуске

4. @дэвид О, я бы не знал. Я бы проверил их всех 🙂 Совет Мики звучит убедительно. Сделайте все, что вам нужно сделать только один раз за пределами цикла. Это касается FindWindowExW и некоторых (всех?) других вещей WinAPI тоже.

5. @Miki хорошо, это уменьшает загрузку процессора на 0,5%. загрузка процессора сейчас составляет 15%.