Загрузка данных
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)