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

    @ifadee Автор вопроса
    BSleXP4Вот такое изображение BSleXP4 . Ссылка на изображение - https://imgur.com/a/BSleXP4
    Написано
  • Передает не точную картинку в окно, как сделать чтобы находился определенный объект?

    @ifadee Автор вопроса
    ifadee, Cо вторым кодом вроде бы нажимает стрелочку ,но не очень корректно
    Написано
  • Передает не точную картинку в окно, как сделать чтобы находился определенный объект?

    @ifadee Автор вопроса
    chatgpt ,gpt выдает еще вот такой код
    #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 = "gta_sa.avi"; // Укажите путь к вашему видеофайлу
        const char* template1Path = "15.jpg"; // Укажите путь к вашему шаблону PNG
        const char* template2Path = "78.jpg"; // Укажите путь к вашему шаблону PNG
    
        // Разрешение игры
        int gameWidth = 1280;
        int gameHeight = 720;
    
        // Загрузка видео
        cv::VideoCapture video(videoFilePath);
        if (!video.isOpened()) {
            std::cerr << "Error opening video file." << 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
        int captureWidth = gameWidth;
        int captureHeight = gameHeight;
    
        // Установка размеров окна OpenCV
        cv::namedWindow("Captured Image", cv::WINDOW_NORMAL);
        cv::resizeWindow("Captured Image", captureWidth, captureHeight);
    
        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));
    
                        // Отрисовка 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 секунду перед следующей попыткой поиска окна
            }
        }
    
        return 0;
    }
    Написано