#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%.