Найти изображение на экране - PullRequest
0 голосов
/ 28 апреля 2019

Интересно, как решить эту проблему.Я хочу проверять каждые X секунд, если на экране содержится изображение (например, красная точка), и если да, вернуть True.Я очень хорошо знаком с Python, и там есть несколько простых решений.Но я еще не нашел аналогичного решения.

Что я в основном хочу сделать:

  1. Сделать снимок экрана
  2. Найти изображение X на снимке экрана
  3. Return bool

Заглянул в OpenCV и мог бы решить эту проблему таким образом, но это может быть немного чрезмерно.Я думал о том, чтобы getPixel перебрал все пиксели на экране.Но это очень медленно.

#include <Windows.h>
#include <iostream>

using namespace std;

int main()
{
    HWND runelite = GetForegroundWindow();
    HMONITOR monitor = MonitorFromWindow(runelite, MONITOR_DEFAULTTONEAREST);
    MONITORINFO info;
    info.cbSize = sizeof(MONITORINFO);
    GetMonitorInfo(monitor, &info);
    int monitor_width = info.rcMonitor.right - info.rcMonitor.left;
    int monitor_height = info.rcMonitor.bottom - info.rcMonitor.top;

    int r, g, b;

    HDC screenshot = GetDC(NULL); 

    for (int i = 0; i < monitor_height; i++) {
        for (int j = 0; j < monitor_width; j++) {
            DWORD color = GetPixel(screenshot, j, i);
            cout << "Scanning -> X: " << j << " Y: " << i << endl;
            r = GetRValue(color);
            g = GetGValue(color);
            b = GetBValue(color);
            if (r == 0 && g == 0 && b == 0) {
                cout << "Button found by color!" << endl;
                goto end;
            }
        }
    }

    end:
    ReleaseDC(NULL, screenshot);
    return 0;
}

1 Ответ

3 голосов
/ 28 апреля 2019

вы можете значительно увеличить скорость, если скопируете содержимое HDC s в другое растровое изображение, получите указатель на данные изображения и выполните цикл по нему.

создайте растровое изображение памяти

HDC memDC = CreateCompatibleDC ( hDC );
HBITMAP memBM = CreateCompatibleBitmap ( hDC, nWidth, nHeight );
SelectObject ( memDC, memBM );

затем добавьте данные экрана к этому растровому изображению с помощью BitBlt и получите данные растрового изображения с помощью GetDIBits.

. Обратите также внимание, что GetDC(NULL) не делает снимок экрана, но дает вам доступ кWindows Live Основной HDC.рисунок к нему прямо рисует на рабочем столе.Вот почему каждый GetPixel занимает довольно много времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...