Search

Qt 및 OpenCV를 이용한 실시간 스트리밍 서비스 개발(AI CCTV Monitoring)

회사
Kai
참여 포지션
Windows 앱 개발자
Android 앱 개발자
진행기간
2020.11 ~ 2021.05

소개

이상 감지 알림을 수신하면 감지된 이미지와 해당 CCTV 및 주변 CCTV를 실시간으로 스트리밍하는 서비스입니다.
윈도우 모니터링 앱과 윈도우 & 안드로이드 알림 앱으로 구성되었습니다.

사용 기술

Monitoring (Windows App)

C++, Qt, OpenCV

Noti App (Android App & Windows App)

C++, Qt, Kotlin

진행 업무

[Monitoring] - 영상 스트리밍 성능 개선

4K CCTV 영상을 스트리밍하는 컴포넌트의 성능이 약 5프레임이었습니다.
OpenCV로 프레임을 가져오는 로직과 화면에 표출하는 로직 모두 하나의 메인 스레드에서 작업하여 발생한 문제였습니다.
OpenCV 로직을 가진 클래스와 화면 표출용 컴포넌트 클래스로 분리하고, 서로를 별도의 스레드로 분리했습니다.
컴포넌트가 화면에서 구성될 때 최대 720p 크기로 구성되기 때문에 프레임을 4K→ 720p로 다운사이징했습니다.
프레임 저장 변수를 스레드 세이프하게 다루기 위해 Mutex를 적용했습니다.
스트리밍 성능이 27~28프레임 정도로 5배가량 개선되었습니다.

[Monitoring] - UI 리팩토링

Qt-UI & C++ 방식으로 개발했었으나 유지보수가 까다로워서 요구사항 반영이 힘들었습니다.
레이아웃 구성을 제외하면 화면 애니메이션, 동적 스타일 변경 등을 모두 C++로 구현해야 하는 방식이라 생산성이 매우 떨어집니다.
불필요하게 화면 구성에 쓰인 C++ 코드를 QML로 대체하고, 성능이 필요한 로직은 C++로 개발하여 리팩토링을 진행하였습니다.
QML은 선언형 UI로, 이후 추가된 해상도별 반응형 구성도 빠르게 대응할 수 있었고, 코드 가독성을 올림으로써 불필요한 소통을 줄이고 전체적인 개발 능률이 올라갔습니다.

[Noti App] - 크로스 플랫폼 대응

이후 진행하게 될 과업 중 알림을 안드로이드뿐만 아니라 다양한 플랫폼에서 수신할 수 있어야 한다는 요구사항이 있었습니다.
사내 개발자 대부분의 메인 기술 스택이 C++이었고, 다른 개발자분들의 일정이 특정 플랫폼에 특화된 기술 스택을 새로 배우기는 어려운 환경이었습니다.
안드로이드, 윈도우에서 구동될 수 있도록 Qt와 C++로 코드를 구성하였습니다.
멀티 플랫폼 대응을 위해서 FCM 네이티브 코드를 C++ 모듈로 래핑하였습니다.
이로써 담당 개발자에 관계없이 코드 유지보수가 가능하게 되었습니다.

[Noti App] - 알림 미수신 이슈 대응

모바일 앱에서 FCM 알림을 수신하지 못하는 이슈가 발생했습니다.
이상 감지 알림 생성이 너무 자주 발생하여 rate limit 이후 알림이 수신되지 않는 것이 원인이었습니다.
초기에는 단순히 알림이 오지 않는다는 내용으로 이슈가 들어와서 어떤 문제인지 파악이 되지 않았으나, 여러 조건으로 테스트해 본 결과, 서버에서 publish하는 알림 큐는 5분 이내에 25개로 알림 개수에 제한이 걸려있었고, 앱에서는 상단 바에 쌓인 알림이 20개일 경우 추가 알림이 수신되지 않는 이슈가 있음을 알게 되었습니다.
서버에서 알림 큐 제한을 전부 채우지 않고, 중복된 내용의 알림은 보내지 않는 등의 최적화 로직을 구현했습니다.

회고

VLC 라이브러리로 스트리밍 컴포넌트를 구성했을 때 GPU로 연산하기에 더 좋은 더포먼스가 나왔었습니다.
4K CCTV 스트리밍 컴포넌트를 GPU에서 연산할 수 있도록 리펙토링하면 좋을 것 같습니다.
스트리밍 프레임을 화면 표출용 컴포넌트에 전달하는 방식을 Mutex가 적용한 변수에 접근하는 것 대신 Event로 전달하는 리펙토링을 진행하면 더 나은 성능이 나올 것 같아 아쉽습니다.