@ifadee

Передает не точную картинку в окно, как сделать чтобы находился определенный объект?

Есть такой код :
#include <windows.h>
#include <opencv2/opencv.hpp>

void simulateKeyPress(WORD keyCode) {
    INPUT input;
    input.type = INPUT_KEYBOARD;
    input.ki.wVk = keyCode;
    input.ki.dwFlags = 0;

    SendInput(1, &input, sizeof(INPUT));
}

void simulateKeyRelease(WORD keyCode) {
    INPUT input;
    input.type = INPUT_KEYBOARD;
    input.ki.wVk = keyCode;
    input.ki.dwFlags = KEYEVENTF_KEYUP;

    SendInput(1, &input, sizeof(INPUT));
}

int main() {
    const char* gameWindowTitle = "GTA:SA:MP"; // GTA:SA:MP
    const char* videoFilePath = "output_video.avi"; // Путь к выходному видеофайлу
    const char* template1Path = "09.jpg"; // Путь к вашему шаблону PNG
    const char* template2Path = "9.jpg"; // Путь к вашему шаблону PNG

    // Разрешение игры
    int gameWidth = 1920;
    int gameHeight = 1080;

    // Установка соответствующих размеров захвата в OpenCV
    int captureWidth = gameWidth;
    int captureHeight = gameHeight;

    // Загрузка видео
    cv::VideoCapture video;
    video.open(0);  // 0 - индекс камеры, может потребоваться изменить

    if (!video.isOpened()) {
        std::cerr << "Error opening video device." << std::endl;
        return -1;
    }

    // Загрузка оттенков серого шаблонов
    cv::Mat template1 = cv::imread(template1Path, cv::IMREAD_GRAYSCALE);
    cv::Mat template2 = cv::imread(template2Path, cv::IMREAD_GRAYSCALE);

    if (template1.empty() || template2.empty()) {
        std::cerr << "Error loading template images." << std::endl;
        return -1;
    }

    // Привести шаблоны к одному типу данных
    int commonType = CV_8U;  // Используйте нужный тип данных

    // Перебираем все шаблоны и приводим их к общему типу данных
    template1.convertTo(template1, commonType);
    template2.convertTo(template2, commonType);

    // Установка размеров окна OpenCV
    cv::namedWindow("Captured Image", cv::WINDOW_NORMAL);
    cv::resizeWindow("Captured Image", captureWidth, captureHeight);

    // Создание объекта VideoWriter для записи видео
    cv::VideoWriter videoWriter(videoFilePath, cv::VideoWriter::fourcc('X', 'V', 'I', 'D'), 25, cv::Size(captureWidth, captureHeight), true);

    while (true) {
        HWND gameWindow = FindWindowA(NULL, gameWindowTitle);

        if (gameWindow != NULL) {
            RECT gameWindowRect;
            GetWindowRect(gameWindow, &gameWindowRect);

            // Задание координат и размеров захвата для всего экрана
            int captureX = gameWindowRect.left;
            int captureY = gameWindowRect.top;

            cv::Mat capturedImage;

            HDC hdcScreen = GetDC(gameWindow);
            HDC hdcCapture = CreateCompatibleDC(hdcScreen);
            HBITMAP hCaptureBitmap = CreateCompatibleBitmap(hdcScreen, captureWidth, captureHeight);
            SelectObject(hdcCapture, hCaptureBitmap);
            BitBlt(hdcCapture, 0, 0, captureWidth, captureHeight, hdcScreen, captureX, captureY, SRCCOPY);

            capturedImage.create(captureHeight, captureWidth, CV_8U);
            GetBitmapBits(hCaptureBitmap, captureWidth * captureHeight, capturedImage.data);

            // Отрисовка прямоугольника, обозначающего всю область захвата
            cv::rectangle(capturedImage, cv::Rect(0, 0, captureWidth, captureHeight), cv::Scalar(0, 255, 0), 2);

            double thresholdValue = 0.8;  // Пороговое значение для сравнения

            // Перебираем все шаблоны
            for (const cv::Mat& templateImage : { template1, template2 }) {
                cv::Mat result;
                cv::matchTemplate(capturedImage, templateImage, result, cv::TM_CCOEFF_NORMED);

                double maxVal;
                cv::Point maxLoc;
                cv::minMaxLoc(result, NULL, &maxVal, NULL, &maxLoc);

                // Выводим значения maxVal и matchLoc в консоль
                std::cout << "maxVal: " << maxVal << " | matchLoc: " << maxLoc << std::endl;

                // Если найдено совпадение с шаблоном, выполнить действие
                if (maxVal > thresholdValue) {
                    // Определение bounding box вокруг найденного объекта
                    cv::Rect boundingBox(maxLoc.x, maxLoc.y, templateImage.cols, templateImage.rows);

                    // Эмуляция нажатия клавиши вправо
                    simulateKeyPress(VK_RIGHT);
                    Sleep(100);
                    simulateKeyRelease(VK_RIGHT);

                    // Изменение размера изображения до разрешения игры
                    cv::resize(capturedImage, capturedImage, cv::Size(gameWidth, gameHeight));

                    // Запись захваченного изображения в видео
                    videoWriter.write(capturedImage);

                    // Отрисовка bounding box на изображении
                    cv::rectangle(capturedImage, boundingBox, cv::Scalar(0, 0, 255), 2);
                    break; // Прервать цикл, так как уже выполнено действие
                }
            }

            DeleteObject(hCaptureBitmap);
            DeleteDC(hdcCapture);
            ReleaseDC(gameWindow, hdcScreen);

            // Отображение захваченного изображения
            cv::imshow("Captured Image", capturedImage);

            if (cv::waitKey(30) == 27) {
                break;
            }
        }
        else {
            std::cerr << "Game window not found." << std::endl;
            Sleep(1000);  // Подождите 1 секунду перед следующей попыткой поиска окна
        }
    }

    // Освобождение ресурсов VideoWriter перед завершением программы
    videoWriter.release();

    return 0;
}
сделанный chatgpt. Почему-то в окно, которое он показывает приходит картинка, как из кривого зеркала, каких-то объектов не видно какие-то большие. Как это исправить?И ещё естественно не находит картинки и видео в игре, как это тоже исправить?Как мне самому до этого дойти? Изучаю не много с++.Намекните пожалуйста
  • Вопрос задан
  • 156 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы