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


import os
import cv2 as cv


# --------------------------------------------------
# Настройки
# --------------------------------------------------

# --------------------------------------------------
# CAMERA_INDEX, FRAME_WIDTH, FRAME_HEIGHT SAVE_FOLDER и BOARD_SIZE

CAMERA_INDEX = 1

FRAME_WIDTH = 640
FRAME_HEIGHT = 480

SAVE_FOLDER = "calibration_images"

BOARD_SIZE = (9, 6)
# --------------------------------------------------

os.makedirs(SAVE_FOLDER, exist_ok=True)


# --------------------------------------------------
# Открытие камеры
# --------------------------------------------------

camera = cv.VideoCapture(CAMERA_INDEX)

if not camera.isOpened():
    print("Не удалось открыть камеру")
    raise SystemExit


camera.set(cv.CAP_PROP_FRAME_WIDTH, FRAME_WIDTH)
camera.set(cv.CAP_PROP_FRAME_HEIGHT, FRAME_HEIGHT)


width = int(camera.get(cv.CAP_PROP_FRAME_WIDTH))
height = int(camera.get(cv.CAP_PROP_FRAME_HEIGHT))
fps = camera.get(cv.CAP_PROP_FPS)


print("Камера открыта")
print("Индекс камеры:", CAMERA_INDEX)
print("Разрешение:", width, "x", height)
print("FPS:", fps)

print()
print("ПРОБЕЛ — сделать фотографию")
print("Q или ESC — закончить работу")


# --------------------------------------------------
# Получение и сохранение кадров
# --------------------------------------------------

photo_number = 1

while True:

    success, frame = camera.read()

    if not success:
        print("Не удалось получить кадр")
        break


    # Создаём копию кадра для отрисовки
    # Исходный frame останется чистым
    display_frame = frame.copy()


    # --------------------------------------------------
    # Поиск шахматной доски
    # --------------------------------------------------

    gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)

    found, corners = cv.findChessboardCorners(
        gray,
        BOARD_SIZE
    )


    # Если углы найдены — рисуем их
    if found:

        cv.drawChessboardCorners(
            display_frame,
            BOARD_SIZE,
            corners,
            found
        )

        board_text = "BOARD FOUND"
        board_color = (0, 255, 0)

    else:

        board_text = "BOARD NOT FOUND"
        board_color = (0, 0, 255)


    # --------------------------------------------------
    # Рисуем верхнюю панель
    # --------------------------------------------------

    cv.rectangle(
        display_frame,
        (0, 0),
        (display_frame.shape[1], 100),
        (30, 30, 30),
        thickness=-1
    )


    cv.putText(
        display_frame,
        "SPACE: save photo",
        (20, 35),
        cv.FONT_HERSHEY_SIMPLEX,
        0.8,
        (255, 255, 255),
        2,
        cv.LINE_AA
    )


    cv.putText(
        display_frame,
        "Q / ESC: exit",
        (20, 75),
        cv.FONT_HERSHEY_SIMPLEX,
        0.8,
        (255, 255, 255),
        2,
        cv.LINE_AA
    )


    cv.putText(
        display_frame,
        board_text,
        (width - 300, 35),
        cv.FONT_HERSHEY_SIMPLEX,
        0.8,
        board_color,
        2,
        cv.LINE_AA
    )


    cv.putText(
        display_frame,
        f"Photos: {photo_number - 1}",
        (width - 300, 75),
        cv.FONT_HERSHEY_SIMPLEX,
        0.8,
        (0, 220, 255),
        2,
        cv.LINE_AA
    )


    # Показываем кадр с отрисовкой
    cv.imshow("Calibration capture", display_frame)


    key = cv.waitKey(1) & 0xFF


    # --------------------------------------------------
    # Сохранение фотографии
    # --------------------------------------------------

    if key == ord(" "):

        filename = f"{SAVE_FOLDER}/calib_{photo_number}.jpg"

        # Сохраняем исходный frame,
        # а не display_frame с надписями
        cv.imwrite(filename, frame)

        print(
            f"Фотография {photo_number} сохранена: {filename}"
        )

        if found:
            print("Шахматная доска на фотографии найдена")
        else:
            print("Внимание: шахматная доска не найдена")

        photo_number += 1


    elif key == ord("q") or key == 27:
        break


# --------------------------------------------------
# Завершение работы
# --------------------------------------------------

camera.release()
cv.destroyAllWindows()

print("Камера закрыта")
print("Всего сделано фотографий:", photo_number - 1)