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