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


#include <opencv2/opencv.hpp>
#include <iostream>
#include <vector>

int main() {
    // 1. Загружаем скриншот/картинку
    cv::Mat image = cv::imread("board.png");
    if (image.empty()) {
        std::cout << "[ERROR] Fail board.png ne naiden!" << std::endl;
        return -1;
    }

    // Размеры сетки внутренних углов (для шахмат 8x8 внутри 7x7 углов)
    cv::Size patternSize(7, 7);
    std::vector<cv::Point2f> corners;

    std::cout << "[...] Ishem ugly doski cherez OpenCV..." << std::endl;

    // 2. Исполняем ту самую «особую» функцию
    bool found = cv::findChessboardCorners(
        image, 
        patternSize, 
        corners,
        cv::CALIB_CB_ADAPTIVE_THRESH | cv::CALIB_CB_NORMALIZE_IMAGE | cv::CALIB_CB_FAST_CHECK
    );

    if (!found) {
        std::cout << "[FAIL] OpenCV ne smog naiti ugly. Prover osvetschenie ili perekrytie kletok!" << std::endl;
        return -1;
    }

    std::cout << "[OK] Ugly doski uspeshno naideny!" << std::endl;

    // 3. Уточняем координаты углов с точностью до субпикселя
    cv::Mat gray;
    cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY);
    cv::cornerSubPix(gray, corners, cv::Size(11, 11), cv::Size(-1, -1),
                     cv::TermCriteria(cv::TermCriteria::EPS + cv::TermCriteria::COUNT, 30, 0.1));

    // Берём 4 крайних угла из найденной сетки
    cv::Point2f topLeft = corners[0];
    cv::Point2f topRight = corners[6];
    cv::Point2f bottomLeft = corners[42];
    cv::Point2f bottomRight = corners[48];

    // Исходные точки с фото
    std::vector<cv::Point2f> srcPoints = { topLeft, topRight, bottomRight, bottomLeft };

    // Желаемый размер выровненного квадрата доски (например, 800x800 пикселей)
    int boardSize = 800;
    std::vector<cv::Point2f> dstPoints = {
        cv::Point2f(0, 0),
        cv::Point2f(boardSize, 0),
        cv::Point2f(boardSize, boardSize),
        cv::Point2f(0, boardSize)
    };

    // 4. Трансформация перспективы (выпрямление наклоненной доски)
    cv::Mat transformMatrix = cv::getPerspectiveTransform(srcPoints, dstPoints);
    cv::Mat croppedBoard;
    cv::warpPerspective(image, croppedBoard, transformMatrix, cv::Size(boardSize, boardSize));

    // 5. Сохраняем идеальный квадрат вырезанной доски
    cv::imwrite("crop_board.png", croppedBoard);
    std::cout << "[SUCCESS] Wyrovnennaya doska sohranena v 'crop_board.png'!" << std::endl;

    return 0;
}