#include <iostream>
#include <vector>
// Подключаем библиотеку для работы с картинками
#define STB_IMAGE_IMPLEMENTATION
#include "stb_image.h"
// Структура для удобного хранения цвета пикселя
struct Pixel {
unsigned char r, g, b;
};
// Функция получения цвета пикселя по координатам (x, y)
Pixel getPixel(unsigned char* img, int width, int channels, int x, int y) {
int index = (y * width + x) * channels;
return { img[index], img[index + 1], img[index + 2] };
}
int main() {
// Включаем русский язык в консоли
setlocale(LC_ALL, "Russian");
std::cout << "==================================================\n";
std::cout << " C++ Board Finder Engine (Image Scanner v1.0) \n";
std::cout << "==================================================\n\n";
int width, height, channels;
// 1. Загружаем картинку "board.png"
std::cout << "[...] Открываем файл board.png...\n";
unsigned char* img = stbi_load("board.png", &width, &height, &channels, 0);
// Проверка: загрузился ли файл
if (img == NULL) {
std::cout << "\n[ОШИБКА] Не удалось найти или открыть файл 'board.png'!\n";
std::cout << "Проверь, чтобы картинка лежала в той же папке, что и этот .exe файл.\n\n";
std::cout << "Нажми Enter для выхода...";
std::cin.get();
return 1;
}
std::cout << "[OK] Картинка успешно загружена в память!\n";
std::cout << " -> Ширина: " << width << " px\n";
std::cout << " -> Высота: " << height << " px\n";
std::cout << " -> Каналов цвета: " << channels << "\n\n";
// 2. Сканируем картинку на перепады контраста (поиск вероятных границ доски)
std::cout << "[...] Сканируем сетку пикселей и ищем границы доски...\n";
int minX = width, maxX = 0;
int minY = height, maxY = 0;
// Пробегаемся по пикселям с шагом 5 (для скорости на 2 ГБ ОЗУ)
for (int y = 0; y < height; y += 5) {
for (int x = 0; x < width; x += 5) {
Pixel p = getPixel(img, width, channels, x, y);
// Вычисляем яркость пикселя (от 0 до 255)
int brightness = (p.r + p.g + p.b) / 3;
// Если пиксель контрастный (не слишком темный и не слишком светлый), запоминаем рамки
if (brightness > 50 && brightness < 200) {
if (x < minX) minX = x;
if (x > maxX) maxX = x;
if (y < minY) minY = y;
if (y > maxY) maxY = y;
}
}
}
// 3. Выводим найденную область доски
std::cout << "\n================ РЕЗУЛЬТАТЫ ====================\n";
std::cout << "Область доски найдена по координатам:\n";
std::cout << " Левый верхний угол: (" << minX << ", " << minY << ")\n";
std::cout << " Правый нижний угол: (" << maxX << ", " << maxY << ")\n\n";
int boardWidth = maxX - minX;
int boardHeight = maxY - minY;
std::cout << "Размер доски в пикселях: " << boardWidth << "x" << boardHeight << " px\n";
std::cout << "Примерный размер 1 клетки: " << boardWidth / 8 << "x" << boardHeight / 8 << " px\n";
std::cout << "==================================================\n\n";
// Освобождаем оперативку
stbi_image_free(img);
std::cout << "Готово! Нажми Enter для выхода...";
std::cin.get();
return 0;
}