콘텐츠로 건너뛰기

OpenCV를 이용한 앱 개발

1. 프로젝트 목표

컴퓨터 비젼으로, 본인 또는 아이의 얼굴을 캡쳐해서 30-*30 사이트 배운것을 적용

  1. 모핑
  2. 반전
  3. 축이동
  4. 크기변환
  5. 색깔변환
  6. 음향효과
  7. PPT준비
  8. 동영상 저장
  9. youtube링크
  10. git hub에 링크
  11. 발표 시간 10분 이내

이런 프로젝트를 진행하려고 한다.

2. Dev 환경 설정

2.1. GitHub에서 리포지토리 생성

가장 먼저 원격 저장소를 만든다.

  1. GitHub에 로그인 후 New Repository 클릭.
  2. Repository Name 입력 (예: OpenCV_Project01).
  3. Public/Private 설정.
  4. 중요: Initialize this repository with a README, .gitignore, License 항목은 체크하지 않는다. (이미 로컬에 코드가 있으므로 충돌 방지를 위해 빈 저장소로 시작하는 것이 좋다.)
  5. OpenCV를 사용했으므로 OpenCV의 라이센스인 Apache 2 License로 라이센스 설정했다.
  6. 생성 후 https://github.com/jalanwang/OpenCV_Project01.git 형태의 URL을 복사해 둔다.

2.2 WSL에서 VS Code 실행 및 환경 확인

Windows 탐색기나 CMD가 아닌, WSL 터미널에서 VS Code를 열어야 한다.

  1. WSL 터미널을 실행하고 프로젝트 폴더로 이동.
cd ~/work/OpenCV_Project01
  1. VS Code 실행
code .
  1. 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를 연결한다.

  1. 스테이징 및 커밋
git add . git commit -m "Initial commit: OpenCV Project setup"
  1. 브랜치명 변경 (관례상 main 사용)
git branch -M main
  1. 원격 저장소 연결 (아까 복사한 URL 붙여넣기)
git remote add origin https://github.com/jalanwang/OpenCV_Project01.git
  1. 푸시
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에 직접 의존하지 않토록한다.
  • 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}$$

[xy]=[a00a01txa10a11ty][xy1]\begin{bmatrix} x’ \\ y’ \end{bmatrix} = \begin{bmatrix} a_{00} & a_{01} & t_x \\ a_{10} & a_{11} & t_y \end{bmatrix} \begin{bmatrix} x \\ y \\ 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. 관련자료

  • 프로젝트설명:
  • 구글슬라이드:

https://docs.google.com/presentation/d/1bySIvt2jjbtklZcFTFygnkN4TPm_aG6omBD-A4G9eGk/edit?usp=drive_link

태그:

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다