- •Аннотация
- •Содержание
- •Введение
- •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 Тестирование
- •Выводы по четвёртому разделу
- •Заключение
- •Список использованных источников
2. Выбор средств разработки
2.1 Выбор языка программирования для серверной части
Выбор языка программирования для серверной части определяет производительность, скорость разработки и доступность библиотек компьютерного зрения. Серверная система должна одновременно решать три группы задач: захват и обработку видеопотоков в реальном времени, выполнение ресурсоёмких алгоритмов (вычитание фона, стереосопоставление, триангуляция) и обеспечение сетевого взаимодействия с клиентом по WebSocket.
В качестве кандидатов рассматривались три языка: Python (популярный в сфере компьютерного зрения, богатая экосистема), C++ (максимальная производительность, нативные реализации OpenCV) и Go (встроенная конкурентность, растущая популярность в сетевых сервисах). Сравнение проводилось по пяти ключевым критериям: производительность обработки кадра, доступность библиотек компьютерного зрения, скорость разработки, поддержка асинхронности и размер сообщества [18]. Результаты анализа приведены в таблице 2.1.
Таблица 2.1 – Критерии выбора языка
Критерий |
Python |
C++ |
Go |
Производительность (врем я обработки кадра 1920×1080 StereoBM) |
58 мс |
22 мс |
35 мс |
Доступность библиотек CV |
OpenCV-Python 4.8, высокая |
OpenCV 4.8 (нативный), высокая |
gocv (обертка OpenCV), средняя |
Продолжение таблицы 2.1
Критерий |
Python |
C++ |
Go |
Скорость разработки |
Высокая (динамическая типизация, REPL, богатая стандартная библиотека) |
Средняя (статическая типизация, компиляция, управление памятью) |
Средняя (статическая типизация, быстрая компиляция, простой синтаксис) |
Экосистема и сообщество |
Огромное (PyPI 400 тыс. пакетов, Stack Overflow 2,1 млн вопросов по Python) |
Большое (Conan, vcpkg, 1,5 млн вопросов SO) |
Среднее (Go modules, 0,2 млн вопросов SO) |
Поддержка асинхронности |
asyncio, websockets — встроено в стандартную библиотеку с Python 3.4/3.5 |
Boost.Asio, сторонние библиотеки (websocketpp) |
goroutines — нативная конкурентность |
Python выбран по следующим причинам:
Зрелая экосистема компьютерного зрения: OpenCV-Python — официальная Python-обертка, поддерживаемая командой OpenCV; NumPy — де-факто стандарт работы с массивами (карты диспаратности представлены как numpy.ndarray); matplotlib, OpenCV.imshow — быстрая визуализация для отладки;
Скорость прототипирования: динамическая типизация позволяет итеративно экспериментировать с параметрами стереосопоставления (блочный размер, диапазон диспаратности, пост-фильтрация) без перекомпиляции; REPL (IPython, Jupyter Notebook) ускоряет отладку алгоритмов калибровки;
Многопоточность для захвата: модуль threading, несмотря на GIL, эффективен для операций ввода-вывода (вызовы recv() для RTP-пакетов блокируются на уровне ОС, освобождая GIL); для CPU-bound задач (стереосопоставление) функции OpenCV написаны на C++;
