Загрузка данных


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