Как отобразить видеопоток через opencv. Не отображает видеопоток . GTA:SA:MP

Некорректно выводит видеопоток из игры, картинка: -

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

А должно быть вот так:

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

В чем причина? Код на c++

#include <windows.h>
#include <opencv2/opencv.hpp>
   // Разрешение игры
    int gameWidth = 1920;
    int gameHeight = 1080;

    // Загрузка видео
    int main 

{
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;
}

Ответы (0 шт):