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