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


import cv2 as cv
import numpy as np


# --------------------------------------------------
# Настройки
# --------------------------------------------------
# CAMERA_INDEX, , FRAME_HEIGHT, CALIBRATION_FILE
# ----------------------------FRAME_WIDTH----------------------
FRAME_WIDTH = 640
FRAME_HEIGHT = 480
CAMERA_INDEX = 1
CALIBRATION_FILE = "camera_calibration.npz"
# Загружаем параметры калибровки
# --------------------------------------------------

calibration = np.load(CALIBRATION_FILE)

camera_matrix = calibration["camera_matrix"]
distortion = calibration["distortion"]


print("Матрица камеры:")
print(camera_matrix)

print()
print("Коэффициенты искажения:")
print(distortion)


# --------------------------------------------------
# Открываем камеру
# --------------------------------------------------

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))


print()
print("Камера открыта")
print("Разрешение:", width, "x", height)
print("Q или ESC — завершить работу")


# --------------------------------------------------
# Получаем и исправляем кадры
# --------------------------------------------------

try:
    while True:

        success, frame = camera.read()

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


        # Исправляем искажения объектива
        corrected_frame = cv.undistort(
            frame,
            camera_matrix,
            distortion
        )


        # Создаём копии для надписей
        original_view = frame.copy()
        corrected_view = corrected_frame.copy()


        # Подпись исходного изображения
        cv.putText(
            original_view,
            "ORIGINAL",
            (20, 40),
            cv.FONT_HERSHEY_SIMPLEX,
            1,
            (0, 0, 255),
            2,
            cv.LINE_AA
        )


        # Подпись исправленного изображения
        cv.putText(
            corrected_view,
            "CORRECTED",
            (20, 40),
            cv.FONT_HERSHEY_SIMPLEX,
            1,
            (0, 255, 0),
            2,
            cv.LINE_AA
        )


        # Соединяем два изображения горизонтально
        comparison = np.hstack(
            (original_view, corrected_view)
        )


        # Уменьшаем объединённое изображение,
        # чтобы оно помещалось на экране
        comparison = cv.resize(
            comparison,
            None,
            fx=0.5,
            fy=0.5
        )


        cv.imshow(
            "Original | Corrected",
            comparison
        )


        key = cv.waitKey(1) & 0xFF

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


finally:
    camera.release()
    cv.destroyAllWindows()

    print("Камера закрыта")
    print("Программа завершена")