1. 프로젝트 목표
컴퓨터 비젼으로, 본인 또는 아이의 얼굴을 캡쳐해서 30-*30 사이트 배운것을 적용
- 모핑
- 반전
- 축이동
- 크기변환
- 색깔변환
- 음향효과
- PPT준비
- 동영상 저장
- youtube링크
- git hub에 링크
- 발표 시간 10분 이내
이런 프로젝트를 진행하려고 한다.
2. Dev 환경 설정
2.1. GitHub에서 리포지토리 생성
가장 먼저 원격 저장소를 만든다.
- GitHub에 로그인 후 New Repository 클릭.
- Repository Name 입력 (예:
OpenCV_Project01). - Public/Private 설정.
- 중요:
Initialize this repository with a README,.gitignore,License항목은 체크하지 않는다. (이미 로컬에 코드가 있으므로 충돌 방지를 위해 빈 저장소로 시작하는 것이 좋다.) - OpenCV를 사용했으므로 OpenCV의 라이센스인 Apache 2 License로 라이센스 설정했다.
- 생성 후
https://github.com/jalanwang/OpenCV_Project01.git형태의 URL을 복사해 둔다.
2.2 WSL에서 VS Code 실행 및 환경 확인
Windows 탐색기나 CMD가 아닌, WSL 터미널에서 VS Code를 열어야 한다.
- WSL 터미널을 실행하고 프로젝트 폴더로 이동.
cd ~/work/OpenCV_Project01
- VS Code 실행
code .
- VS Code 좌측 하단에 Checking Remote 혹은 WSL: Ubuntu라고 표시되어 있는지 확인한다.
2.3. Git 초기화 및 환경 설정 (VS Code 터미널)
VS Code 내의 터미널(Ctrl + ~)을 열고 아래 명령어를 순차적으로 수행한다.
Git 사용자 설정 (최초 1회)
git config --global user.name "본인ID" git config --global user.email "본인이메일"
robot@kimsh:~/work/OpenCV_Project01$ git config --global user.name "jalanwang" robot@kimsh:~/work/OpenCV_Project01$ git config --global user.email "jalanwang@gmail.com" robot@kimsh:~/work/OpenCV_Project01$ ls -al total 28 drwxr-xr-x 4 robot robot 4096 Jan 2 20:33 . drwxr-xr-x 6 robot robot 4096 Jan 2 20:31 .. drwxr-xr-x 2 robot robot 4096 Jan 2 20:33 .vscode -rw-r--r-- 1 robot robot 1046 Dec 30 09:53 CMakeLists.txt drwxr-xr-x 3 robot robot 4096 Jan 2 20:32 bin -rw-r--r-- 1 robot robot 3500 Dec 30 09:57 code.cpp -rw-r--r-- 1 robot robot 1078 Dec 30 09:56 main.cpp
초기화
git init
이 명령어를 치면 폴더 내에 .git 숨김 폴더가 생성된다.
robot@kimsh:~/work/OpenCV_Project01$ git init hint: Using 'master' as the name for the initial branch. This default branch name hint: is subject to change. To configure the initial branch name to use in all hint: of your new repositories, which will suppress this warning, call: hint: hint: git config --global init.defaultBranch <name> hint: hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and hint: 'development'. The just-created branch can be renamed via this command: hint: hint: git branch -m <name> Initialized empty Git repository in /home/robot/work/OpenCV_Project01/.git/ robot@kimsh:~/work/OpenCV_Project01$ ls -al total 32 drwxr-xr-x 5 robot robot 4096 Jan 2 21:51 . drwxr-xr-x 6 robot robot 4096 Jan 2 20:31 .. drwxr-xr-x 7 robot robot 4096 Jan 2 21:51 .git drwxr-xr-x 2 robot robot 4096 Jan 2 20:33 .vscode -rw-r--r-- 1 robot robot 1046 Dec 30 09:53 CMakeLists.txt drwxr-xr-x 3 robot robot 4096 Jan 2 20:32 bin -rw-r--r-- 1 robot robot 3500 Dec 30 09:57 code.cpp -rw-r--r-- 1 robot robot 1078 Dec 30 09:56 main.cpp robot@kimsh:~/work/OpenCV_Project01$
2.4. .gitignore 파일 생성 (C++ 필수)
C++ 빌드 부산물(실행 파일, 오브젝트 파일 등)이 업로드되지 않도록 프로젝트 루트에 .gitignore 파일을 만들고 아래 내용을 추가한다.
파일명: .gitignore
*.json **/bin/ # C/C++ build artifacts *.exe *.out *.o *.obj .gitignore .vscode/tasks.json programmers/C/Robot-AI.code-workspace *.txt *.csv .vscode/tasks.json .venv Python/python3/module/__pycache__/testmodule.cpython-312.pyc
2.5. 원격 저장소 연결 및 첫 푸시
이제 로컬 Git과 GitHub를 연결한다.
- 스테이징 및 커밋
git add . git commit -m "Initial commit: OpenCV Project setup"
- 브랜치명 변경 (관례상 main 사용)
git branch -M main
- 원격 저장소 연결 (아까 복사한 URL 붙여넣기)
git remote add origin https://github.com/jalanwang/OpenCV_Project01.git
- 푸시
git push -u origin main
5. 확인

3. 소스코드
이 프로젝트는 전략 패턴(Strategy Pattern)을 기반으로 설계되어 있다. 즉, main 함수가 구체적인 구현 내용을 알 필요 없이, 인터페이스만으로 다양한 알고리즘(게임 모드)을 교체하며 실행하는 구조다.
3.1. 구조 및 진입점
main.cpp(Context)- 프로그램의 진입점이다.
WebcamManager를 초기화하고,GameStrategy포인터를 이용해 런타임에 원하는 게임(RedBallGame,TransformGame등)을 선택한다.
GameStrategy.hpp(Interface)- 모든 게임 클래스가 반드시 구현해야 할
run()함수를 정의한 추상 기본 클래스(Abstract Base Class)야. - 이 인터페이스 덕분에
main함수 수정 없이 새로운 게임을 계속 추가할 수 있다.
- 모든 게임 클래스가 반드시 구현해야 할
CMakeLists.txt(Build System)- CMake 빌드 설정 파일. OpenCV 라이브러리를 링크하고 컴파일 옵션을 지정한다.
2.1. 하드웨어 및 유틸리티
WebcamManager.hpp(Driver/Adapter)- OpenCV의
VideoCapture클래스를 래핑(Wrapping)한 클래스다. - 카메라 장치 열기, 해상도 설정, 프레임 획득 같은 하드웨어 I/O 로직을 캡슐화해서 다른 코드들이 OpenCV API에 직접 의존하지 않토록한다.
- OpenCV의
SoundManager.hpp(Utility)- 시스템 명령어(
play,sox)를 호출해서 효과음을 재생하는 정적(Static) 헬퍼 클래스다.
sudo apt-get update && sudo apt-get install -y sox libsox-fmt-all
- 시스템 명령어(
3.1 게임 로직 (Concrete Strategies)
RedBallGame.hpp(Motion Detection)- 핵심 로직: 미분 영상(Differential Imaging).
- 연속된 두 프레임의 차이($|I_t – I_{t-1}|$)를 계산하고 이진화(Thresholding)하여 움직임을 감지한다.
TransformGame.hpp(Affine Transformation)- 핵심 로직: 선형대수(아핀 변환) & 적분(충돌 감지).
- $2 \times 3$ 행렬을 사용해 이미지를 회전, 전단(Shear) 변환시키고, 객체와 화면의 교집합 영역 내 움직임 밀도를 적분하여 상호작용을 판단한다.
PlateCountGame.hpp(Object Counting)- 핵심 로직: 템플릿 매칭(NCC) & NMS.
matchTemplate으로 물체를 찾고, NMS(Non-Maximum Suppression) 알고리즘으로 중복된 검출 박스를 제거하여 정확한 개수를 세는 역할을 한다.
4.1 게임 오브젝트
KimFace.hpp(Entity)- 게임에 등장하는 ‘얼굴’ 객체를 관리한다.
- 핵심 로직: 색상 위상 수학(Color Topology). HSV 색 공간에서 Hue 채널을 모듈러 연산($\pmod{180}$)으로 회전시켜 시각적 피드백을 생성한다.
5. 수학적 배경
이 프로젝트는 미적분학, 선형대수학, 위상수학, 통계학이라는 네 가지 수학적 기둥 위에 설계된 OpenCV API를 이용해서 구축되었다. 소스코드의 각 모듈이 어떤 수학적 원리를 바탕으로 작동하는지 여기서 확인 할 수 있다.
5.1. 미적분학 (Calculus): 움직임과 밀도
- 미분 (Differentiation) – RedBallGame
움직임(Motion)을 감지하기 위해 시간($t$)에 따른 픽셀 밝기($I$)의 변화율을 계산해. 연속된 프레임 간의 차이는 시간에 대한 편미분의 근사치다.
$$\frac{\partial I}{\partial t} \approx | I_t(x,y) – I_{t-1}(x,y) |$$
- 적분 (Integration) – TransformGame
충돌 감지는 단순히 좌표가 겹치는 것이 아니라, 유효 영역($R$) 내부의 움직임 밀도(Density)를 적분하여 판단해. 이는 노이즈로 인한 오작동을 방지하는 강건한(Robust)한 설계다.
$$S = \iint_{R} M(x,y) \,dx\,dy$$
5.2. 선형대수학 (Linear Algebra): 기하 변환
- 아핀 변환 (Affine Transformation) – TransformGame
이미지를 회전하거나 비틀(Shear) 때, 픽셀 좌표 공간을 선형 변환해. 이는 $2 \times 3$ 행렬 $M$을 사용한 행렬 곱셈과 벡터 덧셈으로 표현된다.
$$\begin{bmatrix} x’ \\ y’ \end{bmatrix} = \begin{bmatrix} a_{00} & a_{01} \\ a_{10} & a_{11} \end{bmatrix} \begin{bmatrix} x \\ y \end{bmatrix} + \begin{bmatrix} b_0 \\ b_1 \end{bmatrix}$$
5.3. 위상수학 및 정수론 (Topology & Number Theory): 색상 공간
- 모듈러 연산 (Modular Arithmetic) – KimFace
색상(Hue)은 선형 데이터가 아니라 원형(Circular) 위상을 가져. $0^\circ$와 $360^\circ$가 맞닿아 있는 구조를 코드로 구현하기 위해 모듈러 연산을 사용해. (OpenCV는 $360^\circ$를 8비트에 맞추기 위해 $180$으로 축소함).
$$H_{new} = (H_{old} + \Delta\theta) \pmod{180}$$
5.4. 통계학 (Statistics): 패턴 매칭
- 정규화 교차 상관관계 (NCC) – PlateCountGame
템플릿 매칭은 두 이미지 패치(확률 변수) 간의 유사도를 측정하는 과정이야. 조명 변화에 영향을 받지 않도록 각 픽셀값에서 평균을 뺀 후, 표준편차로 나누어 내적하는 피어슨 상관계수(Pearson Correlation Coefficient) 공식을 사용한다.
$$R(x,y)= \frac{ \sum (T’ \cdot I’) }{ \sqrt{\sum T’^2 \cdot \sum I’^2} }$$
5.5. 집합론 (Set Theory): 영역 중복 제거
- IoU (Intersection over Union) – PlateCountGame (NMS)
중복된 검출 결과를 하나로 합치기(NMS) 위해 두 영역 집합 $A, B$의 겹침 비율을 계산한다.
$$\text{IoU} = \frac{\text{Area}(A \cap B)}{\text{Area}(A \cup B)}$$
6. 배포
6.1 Release 페이지 이동

6.2 태그 및 버젼 설정

6.3 릴리스 노트 작성

6.3. 릴리스 확인

7. 관련자료
- 프로젝트설명:

- 구글슬라이드:
- 학습 및 관련 도구
- OpenCV 4로 배우는 컴퓨터 비전과 머신 러닝, 황선규, 길벗, 초판 10쇄
- QR 코드 생성기: https://qr.naver.com/
- 중적분: https://angeloyeo.github.io/2020/07/30/multiple_integral.html
- Git CLI: https://learngitbranching.js.org/?locale=ko