Получить цвет пикселей по линии с++

Gafask

Участник
Автор темы
137
13
Подскажите пожалуйста метод для более быстрого получения цвета пикселей чем GetPixel.
3:
    int pos_x = 0;
    while (true)
    {
        Sleep(1);
        pos_x++; if (pos_x >= 100) pos_x = 0;
        COLORREF color = GetPixel(GetDC(0), pos_x, 50);
        ReleaseDC(GetDesktopWindow(), GetDC(GetDesktopWindow()));
        std::cout << color<<std::endl;
    }
Либо я тупой🙄 и не так использую но он медленный.
 
Решение
XLAT выкладывал код мини программы, я удалил всё не нужное, оставил только функцию сканирования экрана.
Использовал в своём говно боте, работает быстро, в отличии от GetPixel

Пример:
CaptureScreen CaptureSc;

// Считывает пиксели с экрана
CaptureSc.get_pixel(Начальное положение по X, Начальное положение по Y, Ширина, Высота);

// Получает цвет определённого пикселя из ранее считанной области
int* rgb;
rgb = CaptureSc.info(X координата искомого пикселя, Y координата искомого пикселя);

Лучше используй get_pixel() вне цикла, иначе будет работать существенно медленней

Gafask

Участник
Автор темы
137
13
не используй бесконечный цикл, это плохо, и используй поточную задержку в 500 млсек.
Это не решит проблему, как я почитал форумы. То функция сама по себе медленная. Есть артирнатива это функция ?
 

x0r1x

Потрачен
114
97
Что-то почитал и не чего намекающего на цвет нету. Да и в сообщениях которое оно должно обрабатывать тоже что-то тихо.
в гугле по первому запросу много примеров и способов как это сделать нормально с хорошим кодом.
 
  • Нравится
Реакции: Gafask

Apsapeh

Участник
62
13
XLAT выкладывал код мини программы, я удалил всё не нужное, оставил только функцию сканирования экрана.
Использовал в своём говно боте, работает быстро, в отличии от GetPixel

Пример:
CaptureScreen CaptureSc;

// Считывает пиксели с экрана
CaptureSc.get_pixel(Начальное положение по X, Начальное положение по Y, Ширина, Высота);

// Получает цвет определённого пикселя из ранее считанной области
int* rgb;
rgb = CaptureSc.info(X координата искомого пикселя, Y координата искомого пикселя);

Лучше используй get_pixel() вне цикла, иначе будет работать существенно медленней
 

Вложения

  • XLAT.rar
    1 KB · Просмотры: 37
Последнее редактирование:
  • Нравится
Реакции: Gafask

Gafask

Участник
Автор темы
137
13
XLAT выкладывал код мини программы, я удалил всё не нужное, оставил только функцию сканирования экрана.
Использовал в своём говно боте, работает быстро, в отличии от GetPixel

Пример:
CaptureScreen CaptureSc;

// Считывает пиксели с экрана
CaptureSc.get_pixel(Начальное положение по X, Начальное положение по Y, Ширина, Высота);

// Получает цвет определённого пикселя из ранее считанной области
int* rgb;
rgb = CaptureSc.info(X координата искомого пикселя, Y координата искомого пикселя);

Лучше используй get_pixel() вне цикла, иначе будет работать существенно медленней
Да, код рабочий. Но не быстрый как рассчитывалось прирост к скорости около 38% . Я так понял через winapi быстрого способа нету. Надо через DX11 или opencv юзать .
Да и каким образом получать цвет по кд не юзая цикл. Ожидания нужного цвета = цикл. Но твой ответ верный.
 

Apsapeh

Участник
62
13
Да, код рабочий. Но не быстрый как рассчитывалось прирост к скорости около 38% . Я так понял через winapi быстрого способа нету. Надо через DX11 или opencv юзать .
Да и каким образом получать цвет по кд не юзая цикл. Ожидания нужного цвета = цикл. Но твой ответ верный.
Пример:
#include <iostream>
#include <ctime>
#include "XLAT_head.h"

int main()
{
    using namespace std;

    CaptureScreen CaptureSc;

    // Перебирает 2 073 600 пикселей
    int s_1 = clock();
    CaptureSc.get_pixel(0, 0, 1920, 1080);
    
    for (int x=0; x < 1920; ++x)
    {
        for (int y=0; y < 1080; ++y)
        {
            CaptureSc.info(x, y);
        }
    }

    int e_1 = clock();
    cout << "One: " << e_1 - s_1 << " msec" << endl;


    // Перебирает 1920 пикселей
    int s_2 = clock(); 
    
    for (int x=0; x < 1920; ++x)
    {
        for (int y=0; y < 1; ++y)
        {
            CaptureSc.get_pixel(x, y, 1, 1);
            CaptureSc.info(x, y);
        }
    }

    int e_2 = clock();
    cout << "Two: " << e_2 - s_2 << " msec" << endl;
}

1646859082690.png

Один раз просканируй экран через get_pixel() и потом перебирай отдельные пиксели через цикл, при таком подходе получается ~50 млн пикселей в секунду
 
  • Нравится
Реакции: Gafask

Gafask

Участник
Автор темы
137
13
Пример:
#include <iostream>
#include <ctime>
#include "XLAT_head.h"

int main()
{
    using namespace std;

    CaptureScreen CaptureSc;

    // Перебирает 2 073 600 пикселей
    int s_1 = clock();
    CaptureSc.get_pixel(0, 0, 1920, 1080);
   
    for (int x=0; x < 1920; ++x)
    {
        for (int y=0; y < 1080; ++y)
        {
            CaptureSc.info(x, y);
        }
    }

    int e_1 = clock();
    cout << "One: " << e_1 - s_1 << " msec" << endl;


    // Перебирает 1920 пикселей
    int s_2 = clock();
   
    for (int x=0; x < 1920; ++x)
    {
        for (int y=0; y < 1; ++y)
        {
            CaptureSc.get_pixel(x, y, 1, 1);
            CaptureSc.info(x, y);
        }
    }

    int e_2 = clock();
    cout << "Two: " << e_2 - s_2 << " msec" << endl;
}

Посмотреть вложение 139235
Один раз просканируй экран через get_pixel() и потом перебирай отдельные пиксели через цикл, при таком подходе получается ~50 млн пикселей в секунду
Да , думаю так будет быстрее. Позже проверим.

Пример:
#include <iostream>
#include <ctime>
#include "XLAT_head.h"

int main()
{
    using namespace std;

    CaptureScreen CaptureSc;

    // Перебирает 2 073 600 пикселей
    int s_1 = clock();
    CaptureSc.get_pixel(0, 0, 1920, 1080);
   
    for (int x=0; x < 1920; ++x)
    {
        for (int y=0; y < 1080; ++y)
        {
            CaptureSc.info(x, y);
        }
    }

    int e_1 = clock();
    cout << "One: " << e_1 - s_1 << " msec" << endl;


    // Перебирает 1920 пикселей
    int s_2 = clock();
   
    for (int x=0; x < 1920; ++x)
    {
        for (int y=0; y < 1; ++y)
        {
            CaptureSc.get_pixel(x, y, 1, 1);
            CaptureSc.info(x, y);
        }
    }

    int e_2 = clock();
    cout << "Two: " << e_2 - s_2 << " msec" << endl;
}

Посмотреть вложение 139235
Один раз просканируй экран через get_pixel() и потом перебирай отдельные пиксели через цикл, при таком подходе получается ~50 млн пикселей в секунду
Щас замеры не большие провел на скорость сканирование в реал тайме 100 пикселей и по факту GetPixel медленнее на 1-5 мс. Условия замера было поиск цвета пикселя на рабочем столе который меняет свой цвет каждый тик . Ну если сканировать как ты сказал , сначала брать изображение потом его быстро сканировать если нужна линия то да твой вариант решения это проблемы лучший . А вот попытка получить цвет в реал тайме то получается 1-5 мс. Так что вариант не юзать winapi а идти и opencv ковырять или dx11 . Спасибо за помощь.
 
Последнее редактирование:
  • Нравится
Реакции: Apsapeh