0%

Backend

카메라 편하게 씁시다~

정호종··수정됨 2026.07.21

카메라 편하게 씁시다~

여러 대의 카메라를 한 화면으로 합쳐 스트리밍하기


Main.png

출력 해상도를 정하고, 점선 가이드 안에서 카메라 영상들을 드래그·회전·크기조정으로 정렬하면 하나의 합성 영상이 만들어지고, 그대로 로컬호스트 스트림으로 송출되는 데스크톱 앱. 외부 가상카메라 드라이버 없이 빌드된 프로그램 하나로 동작한다.

무엇을 푸는가


여러 대의 USB/UVC 카메라 영상을 하나의 캔버스에 배치해 합성하고 싶을 때, 보통은 OBS나 VideoStitch 같은 별도 스티칭 도구를 거쳐야 한다. 이 프로젝트는 정렬 → 합성 → 출력을 프로그램 하나로 끝내는 것을 목표로 했다.

사용 흐름은 단순하다.

  1. 출력 해상도 입력 → 점선 가이드(출력 캔버스) 생성

  2. 카메라별 미리보기를 드래그/회전/스케일로 가이드 안에 정렬

  3. 합성된 프레임을 http://localhost:<포트>/ 로 MJPEG 스트림 송출

수신 측은 표준 MJPEG만 지원하면 된다 — 브라우저, VLC, ffmpeg, OpenCV 모두 가능하다.

핵심 설계 결정


1. 출력은 "가상카메라 드라이버" 대신 내장 HTTP MJPEG 서버

가장 직관적인 출력 방식은 OS 가상카메라 장치를 만드는 것이지만, 이는 OS별 커널/드라이버 설치를 요구하고 배포가 까다롭다. 대신 표준 라이브러리 http.server 기반으로 multipart/x-mixed-replace MJPEG 스트림을 송출했다.

  • 장점: 외부 설치물 0. 빌드된 실행 파일 단독으로 동작하고, URL을 받는 앱이면 어디서든 수신. (하단에 이미지를 받는 예시 코드 #UNITY)

Usingunity.png

2. 완벽한 동기화는 포기하고 best-effort로

일반 USB 카메라에는 하드웨어 genlock이 없어 프레임 단위 완벽 동기화가 물리적으로 불가능하다. 무리하게 시도하는 대신 타임스탬프 기반으로 가장 가까운 프레임을 매칭하는 best-effort 정렬만 한다.

3. 실시간(저지연)이 아니라 ~10fps를 목표로

요구사항을 "완전한 실시간"이 아닌 미리보기·출력 ~10fps 이상으로 정의하니 아키텍처가 크게 단순해졌다. 고해상도·다수 카메라에서 FPS가 병목이 되면 그때 핵심 경로만 C++/Numba로 이식하는 전략을 택했다.

부딪힌 현실적 난점


  • 합성 품질: 렌즈 왜곡, 카메라 간 노출/화이트밸런스 차이, 겹침 경계(seam)가 자연스러운 합성을 어렵게 한다. 개선하려면 후에 필터를 추가해서 개선할 예정이다.

  • 카메라 권한: macOS는 첫 실행 시 권한 프롬프트(NSCameraUsageDescription), Windows는 개인정보 설정에서 차단될 수 있어 시작 시 안내가 필요하다.

측정 가능한 목표


추상적인 "99.9%" 류 수치 대신 검증 가능한 기준으로 정의했다.

  • FPS: 1080p × 카메라 2대 합성 시 ≥10fps (개발 PC 기준, 측정 스크립트 포함)

  • 정렬 정확도: 1px 스텝 픽셀 단위 드래그 지원

  • 지연: 캡처→출력 end-to-end 지연을 로그로 측정해 회귀 추적 (상한 보장은 하지 않음)

읽기 도구

3분 읽기

이 글이 도움이 되었나요?

다음으로 읽기