У світі комп’ютерного зору відстеження об’єктів залишається однією з фундаментальних задач з широким спектром практичного застосування: від систем відеоспостереження до аналізу спортивних подій та автоматизованих виробничих процесів. Створення прототипу доступного інструменту для відстеження об’єктів, який би поєднував простоту використання та потужні можливості сучасних алгоритмів трекінгу, стало метою мого пет проєкту ВідеоТрекер.
У цій статті я поділюсь досвідом розробки цієї системи, розповім про виклики, з якими довелось зіткнутися, та технічні рішення, які були впроваджені для створення функціонального та зручного додатка.
Що таке ВідеоТрекер?
ВідеоТрекер — це настільний додаток, розроблений для відстеження довільних об’єктів на відео з використанням сучасних алгоритмів комп’ютерного зору. Основна ідея полягає в тому, що користувач може завантажити відеофайл або підключити веб-камеру, вибрати область інтересу (об’єкт для відстеження), і програма автоматично відстежуватиме цей об’єкт упродовж усього відео, візуалізуючи його траєкторію.
Основні функції системи:
- Завантаження відеофайлів різних форматів (mp4, avi, mov, mkv)
- Захоплення відео з веб-камери
- Інтерактивний вибір області відстеження за допомогою миші
- Ручне задання координат області відстеження
- Використання різних алгоритмів трекінгу (KCF, CSRT, MOSSE)
- Візуалізація траєкторії руху об’єкта
- Зручна навігація по відео (повзунок, кнопки керування)
- Аналіз параметрів траєкторії руху
- Експорт результатів відстеження (CSV, відео з розміткою)
Технологічний стек
Для реалізації проєкту був обраний наступний стек технологій:
- Python як основна мова програмування завдяки простоті, багатій екосистемі та відмінній підтримці бібліотек комп’ютерного зору
- OpenCV для роботи з відео та алгоритмами відстеження об’єктів
- PyQt5 для створення графічного інтерфейсу користувача
- NumPy для ефективної роботи з масивами даних
- Matplotlib для візуалізації та аналізу траєкторій
- Pandas для обробки та експорту даних
Така комбінація технологій дозволила поєднати потужні можливості обробки відео та комп’ютерного зору з сучасним графічним інтерфейсом.
Архітектура системи
Система побудована за принципами модульної архітектури, що спрощує її підтримку та подальший розвиток:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
video_tracker/ ├── src/ │ ├── main.py # Точка входу програми │ ├── tracker/ │ │ ├── video_processor.py # Обробка відео та трекінг │ │ ├── roi_selector.py # Вибір області інтересу │ │ └── algorithms.py # Алгоритми трекінгу │ ├── ui/ │ │ ├── main_window.py # Головне вікно програми │ │ └── control_panel.py # Панель керування │ └── utils/ │ ├── trajectory.py # Аналіз траєкторій │ └── export.py # Експорт результатів |
Додаток використовує багатопотокову архітектуру, де обробка відео та трекінг виконуються в окремому потоці, що забезпечує плавну роботу інтерфейсу користувача навіть при обробці ресурсоємних відеопотоків.
Етапи розробки та виклики
1. Концептуалізація та проєктування
Першим етапом була розробка концепції додатка та проєктування архітектури. Основними вимогами були:
- Інтуїтивно зрозумілий інтерфейс
- Підтримка різних алгоритмів трекінгу
- Можливість роботи як з відеофайлами, так і з камерою
- Аналіз та експорт результатів
Виклик: Проєктування системи, яка б була одночасно простою у використанні для звичайних користувачів, але містила достатньо потужні функції для просунутих користувачів.
Рішення: Використання табованого інтерфейсу, де базові функції доступні на першій вкладці, а більш складні аналітичні інструменти — на додаткових вкладках.
2. Інтеграція OpenCV та PyQt5
Інтеграція бібліотеки комп’ютерного зору (OpenCV) з фреймворком для створення графічного інтерфейсу (PyQt5) виявилась одним із найскладніших завдань.
Виклики:
- Різні формати зображень: OpenCV використовує формат BGR, PyQt5 — RGB
- Необхідність конвертації між NumPy масивами та об’єктами QImage/QPixmap
- Забезпечення плавного відтворення відео без блокування інтерфейсу
- Коректна обробка подій миші для вибору області
Рішення:
- Створення класу
VideoProcessor, який працює в окремому потоці та обробляє відео - Використання Qt-сигналів для передачі кадрів між потоками
- Розробка методу
map_qt_to_cv_coordinatesдля точного перетворення координат - Оптимізація конвертації зображень для підвищення продуктивності
|
1 2 3 4 5 6 7 |
# Приклад конвертації кадру OpenCV у формат PyQt5 def convert_cv_to_qt(cv_frame): height, width, channel = cv_frame.shape bytes_per_line = 3 * width qt_image = QImage(cv_frame.data, width, height, bytes_per_line, QImage.Format_RGB888) return QPixmap.fromImage(qt_image.rgbSwapped()) # BGR -> RGB конвертація |
3. Реалізація вибору області відстеження
Одним із ключових елементів інтерфейсу є можливість інтерактивного вибору області відстеження (ROI).
Виклики:
- Необхідність візуалізації області під час вибору
- Коректне перетворення координат між системами Qt та OpenCV
- Підтримка як ручного введення координат, так і вибору мишею
Рішення:
- Розробка класу
ROISelectorдля обробки подій миші та управління вибором - Реалізація методу для відображення вибраної області в реальному часі
- Забезпечення зворотного зв’язку через відображення розмірів області
4. Алгоритми відстеження та їх оптимізація
Для забезпечення гнучкості системи були інтегровані різні алгоритми трекінгу, кожен з яких має свої переваги та недоліки.
Виклики:
- Різна точність та швидкість алгоритмів
- Налаштування оптимальних параметрів кожного алгоритму
- Відновлення трекінгу при втраті об’єкта
Рішення:
- Реалізація можливості вибору алгоритму залежно від потреб користувача
- Надання детальної інформації про переваги та недоліки кожного алгоритму
- Оптимізація параметрів алгоритмів для різних сценаріїв використання
|
1 2 3 4 5 6 7 8 9 10 11 |
def create_tracker(tracker_type): """Створення трекера вказаного типу""" if tracker_type == 'KCF': return cv2.TrackerKCF_create() elif tracker_type == 'CSRT': return cv2.TrackerCSRT_create() elif tracker_type == 'MOSSE': return cv2.legacy.TrackerMOSSE_create() else: return cv2.TrackerKCF_create() # Типовий варіант |
5. Робота з різними джерелами відео
Система була розроблена з урахуванням можливості роботи як з відеофайлами, так і з потоковим відео з камери.
Виклики:
- Різна обробка навігації для файлів та камери
- Проблеми з повторним використанням ресурсів камери
- Відмінності у продуктивності та вимогах до буферизації
Рішення:
- Реалізація різної логіки для файлів та камери
- Коректне вивільнення ресурсів камери при закритті
- Оптимізація параметрів захоплення для зменшення затримки при роботі з камерою
6. Навігація по відео та інтерфейс керування
Для зручності користувача була реалізована система навігації по відео з повзунком та кнопками керування.
Виклики:
- Забезпечення плавної навігації без перевантаження системи
- Коректна синхронізація позиції повзунка з позицією відео
- Уникнення рекурсивних викликів при зміні позиції
Рішення:
- Використання прапорця
slider_updatingдля запобігання рекурсивним викликам - Оптимізація методу
seek_to_frameдля швидкого переходу до потрібного кадру - Реалізація зручного інтерфейсу з інформацією про поточний кадр
Проблеми та їх вирішення
У процесі розробки системи виникало кілька складних проблем, які вимагали нестандартних рішень.
1. Проблема з вибором області мишкою
Проблема: При виборі області мишкою користувач не бачив прямокутник, що змінювався в реальному часі під час перетягування.
Рішення: Модифікація методу label_mouse_move_event для оновлення зображення з прямокутником вибору в реальному часі при кожному русі миші.
|
1 2 3 4 5 6 7 8 9 |
def label_mouse_move_event(self, event): if self.roi_selecting_mode and self.current_frame is not None: pos = self.map_qt_to_cv_coordinates(event.pos()) self.roi_selector.mouse_callback(cv2.EVENT_MOUSEMOVE, pos[0], pos[1], 0, None) # Оновлення відображення в реальному часі frame_with_selection = self.roi_selector.draw_selection(self.current_frame.copy()) # ... відображення оновленого кадру ... |
2. Проблема з камерою та перезапуском
Проблема: При спробі зупинити роботу з камерою та перезапустити її або перейти на роботу з відеофайлом виникали помилки доступу до ресурсів камери.
Рішення: Впровадження послідовності дій для коректного вивільнення ресурсів з додатковою паузою для гарантованого звільнення.
3. Неправильна конвертація координат
Проблема: При виборі області мишею координати часто були неточними через масштабування відео в інтерфейсі.
Рішення: Розробка більш точного алгоритму перетворення координат, який враховує масштабування та зміщення зображення в інтерфейсі.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
def map_qt_to_cv_coordinates(self, qt_pos): # ... перевірки ... # Розрахунок масштабу з урахуванням співвідношення сторін scale_w = pixmap_size.width() / self.video_processor.video_width scale_h = pixmap_size.height() / self.video_processor.video_height scale = min(scale_w, scale_h) # Розрахунок зміщення для центрованого зображення offset_x = (label_size.width() - (self.video_processor.video_width * scale)) / 2 offset_y = (label_size.height() - (self.video_processor.video_height * scale)) / 2 # Перетворення координат cv_x = int((qt_pos.x() - offset_x) / scale) cv_y = int((qt_pos.y() - offset_y) / scale) # ... обмеження координат ... return (cv_x, cv_y) |
Розширення функціональності
У процесі розробки система була розширена додатковими функціями, які покращили користувацький досвід:
1. Навігація по відео
Для зручності користувачів було додано комплексну систему навігації по відео:
- Повзунок для швидкого переміщення по відео
- Кнопки покадрової навігації та швидкої перемотки
- Інформація про поточний кадр та загальну кількість кадрів
2. Аналіз траєкторії руху
Для аналітичних цілей була розроблена функціональність аналізу траєкторії руху об’єкта:
- Обчислення загальної довжини траєкторії
- Визначення середньої швидкості руху
- Визначення кількості змін напрямку
- Візуалізація траєкторії на графіку
3. Експорт результатів
Для подальшого використання результатів відстеження були додані функції експорту:
- Експорт траєкторії в CSV формат для аналізу в інших програмах
- Збереження відео з розміткою траєкторії та прямокутником відстеження
Технічні особливості реалізації
Багатопотоковість
Для забезпечення плавної роботи інтерфейсу обробка відео виконується в окремому потоці:
|
1 2 3 4 5 6 7 8 |
class VideoProcessor(QThread): frame_ready = pyqtSignal(np.ndarray, object) def run(self): while self.running: # Обробка кадру... self.frame_ready.emit(frame, tracking_result) |
Перетворення форматів зображень
Ключовим аспектом інтеграції OpenCV та PyQt5 є коректне перетворення форматів зображень:
|
1 2 3 4 5 6 7 |
# OpenCV (BGR) -> PyQt5 (RGB) def convert_frame_to_qt(frame): height, width, channel = frame.shape bytes_per_line = 3 * width q_img = QImage(frame.data, width, height, bytes_per_line, QImage.Format_RGB888) return QPixmap.fromImage(q_img.rgbSwapped()) |
Параметризація алгоритмів трекінгу
Для максимальної гнучкості була реалізована система параметризації алгоритмів:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
def get_tracker_params(tracker_type): if tracker_type == 'KCF': return { 'detect_thresh': { 'default': 0.5, 'min': 0.1, 'max': 0.9, 'description': 'Поріг виявлення об\'єкта' }, # ... інші параметри ... } # ... інші трекери ... |
Висновки та плани розвитку
Розробка системи ВідеоТрекер була захоплюючим та повчальним досвідом, який дозволив поглибити розуміння як алгоритмів комп’ютерного зору, так і особливостей створення сучасних інтерфейсів користувача.
Основні результати:
- Створено функціональний додаток для відстеження об’єктів на відео
- Реалізовано інтуїтивно зрозумілий інтерфейс користувача
- Інтегровано сучасні алгоритми відстеження з можливістю їх параметризації
- Забезпечено роботу з різними джерелами відео
- Реалізовано функції аналізу та експорту результатів
Плани розвитку:
- Додавання детекторів об’єктів для автоматичного виявлення об’єктів певних класів (людей, автомобілів тощо)
- Удосконалення алгоритмів відновлення при втраті об’єкта
- Розширення аналітичних можливостей для більш глибокого аналізу руху
- Оптимізація продуктивності для роботи з високороздільним відео в реальному часі
- Додавання можливості пакетної обробки кількох відеофайлів
Підсумки
Проєкт ВідеоТрекер демонструє, як поєднання сучасних технологій комп’ютерного зору з добре спроєктованим інтерфейсом користувача може створити потужний, але доступний інструмент для відстеження об’єктів на відео. Хоча розробка системи супроводжувалася певними технічними викликами, знайдені рішення дозволили створити надійний та функціональний продукт.
Досвід, отриманий під час цієї розробки, буде цінним для майбутніх проєктів у сфері комп’ютерного зору та розробки інтерфейсів користувача, а сама система має хороший потенціал для подальшого розвитку та застосування в різних галузях.
Якщо у вас є питання щодо проєкту ВідеоТрекер або пропозиції щодо його вдосконалення, будь ласка, залишайте коментарі нижче або зв’яжіться зі мною напряму.