- •Аннотация
- •Содержание
- •Введение
- •1. Анализ предметной области
- •1.1 Принципы построения систем трехмерного позиционирования на базе двух камер
- •1.2 Обнаружение движущихся объектов
- •1.3 Алгоритмы вычитания фона в OpenCv
- •1.4 Геометрическая модель простой триангуляции в стереосистеме
- •1.5 Особенности получения и синхронизации видеопотоков в ip-сетях
- •1.6 Требования к системе
- •Выводы по первому разделу
- •2. Выбор средств разработки
- •2.1 Выбор языка программирования для серверной части
- •2.2 Библиотеки компьютерного зрения
- •2.3 Протоколы обмена: WebSocket и json
- •Выводы по второму разделу
- •3. Моделирование системы
- •3.1 Архитектура системы
- •3.2 Среда виртуализации стереопары
- •3.3 Модель вычитания фона для стереопары
- •3.4 Архитектура двухканального вычитания фона
- •3.8 Вычисление центра ограничивающего квадрата
- •3.9 Адаптивное управление параметрами
- •3.10 Математическая модель простой триангуляции
- •3.11 Математическая модель простой триангуляции
- •3.12 Модель данных
- •Выводы по третьему разделу
- •4. Разработка приложения
- •4.1 Структура проекта
- •4.2 Реализация модуля захвата видеопотоков
- •4.3 Реализация вычитания фона и детекции объекта
- •4.4 Реализация триангуляции
- •4.5 Реализация клиента визуализации
- •4.6 Тестирование
- •Выводы по четвёртому разделу
- •Заключение
- •Список использованных источников
4. Разработка приложения
4.1 Структура проекта
Программная система организован в виде двух независимых, но взаимодействующих приложений: серверной части на языке Python и клиентской части на игровом движке Godot 4. Такое разделение обусловлено различными требованиями к вычислительной мощности и пользовательскому интерфейсу. Сервер выполняет ресурсоёмкие операции компьютерного зрения (вычитание фона, ректификацию, триангуляцию) и может быть развёрнут на выделенной вычислительной машине. Клиент обеспечивает визуализацию трёхмерной сцены и может работать на менее производительном оборудовании.
Серверная часть имеет следующую структуру каталогов:
- src/capture/ — модули захвата видеопотоков с IP-камер по протоколу RTSP;
- src/calibration/ — модули калибровки стереопары, загрузки и сохранения параметров;
- src/stereo/ — модули вычитания фона, детекции объекта и триангуляции;
- src/network/ — WebSocket-сервер и JSON-RPC диспетчер;
- src/config/ — конфигурационные файлы (параметры камер, пороги, пути);
- src/utils/ — вспомогательные функции (логирование, работа с временными метками).
Клиентская часть на Godot 4 включает:
- main.tscn — главная сцена с трёхмерным пространством;
- WebSocketClient.gd — скрипт для подключения к серверу и приёма данных;
- Marker3D.gd — скрипт управления трёхмерным маркером (сферой или моделью);
- CameraController.gd — скрипт для управления камерой сцены (вращение, масштабирование);
- CoordinateGrid.gd — скрипт для отображения координатной сетки и осей.
Схема взаимодействия модулей представлена на рисунке
Рисунок 4.1 – Схема взаимодействия модулей системы
4.2 Реализация модуля захвата видеопотоков
Модуль захвата предназначен для подключения к двум IP-камерам, приёма видеопотоков в реальном времени и извлечения временных меток для последующей синхронизации. Основные требования к модулю: поддержка протокола RTSP, возможность работы с двумя камерами одновременно, минимальная задержка и устойчивость к кратковременным потерям пакетов [14].
При реализации использован класс cv2.VideoCapture, который поддерживает RTSP-URL напрямую. Для каждой камеры создаётся отдельный поток (наследник threading.Thread), в котором в бесконечном цикле вызывается метод read(). Полученный кадр и временная метка (системное время в момент захвата) помещаются в потокобезопасную очередь queue.Queue ограниченного размера (например, 10 кадров). Это позволяет буферизовать кадры и сглаживать кратковременные задержки в сети.
Особое внимание уделено обработке ошибок: если камера недоступна при старте, модуль предпринимает до пяти попыток переподключения с интервалом 2 секунды. В случае устойчивого сбоя в лог записывается сообщение об ошибке, а поток завершается. При восстановлении соединения захват возобновляется автоматически.
4.3 Реализация вычитания фона и детекции объекта
Модуль вычитания фона реализует алгоритм MOG2 из библиотеки OpenCV. Для левой и правой камер создаются отдельные экземпляры cv2.createBackgroundSubtractorMOG2, поскольку фоновые сцены различаются из-за разной перспективы.
Параметры алгоритма MOG2 подбирались экспериментально:
history — количество предыдущих кадров, учитываемых при построении модели фона; установлено значение 500;
varThreshold — порог дисперсии для классификации пикселя; значение 16;
detectShadows — флаг обнаружения теней; включён (значение True).
После получения маски переднего плана применяются морфологические операции: медианная фильтрация для удаления шума, закрытие ядром 5×5 для заполнения отверстий, открытие ядром 3×3 для удаления изолированных выбросов.
Детекция объекта заключается в поиске контуров на очищенной маске с помощью cv2.findContours с режимом RETR_EXTERNAL (только внешние контуры). Выбирается контур с максимальной площадью. Для выбранного контура вычисляется ограничивающий прямоугольник функцией cv2.boundingRect, возвращающей координаты левого верхнего угла (x, y) и размеры (w, h). Центр прямоугольника вычисляется как
(x + w/2, y + h/2) (4.1).
