Ver2.5 너도 할 수 있어! 인싸력 풀충전 실시간 얼굴 필터 만들기 A to Z

너도 할 수 있어! 인싸력 풀충전 실시간 얼굴 필터 만들기 A to Z
안녕! 👋 혹시 인스타그램 릴스나 틱톡 보면서 '와, 이 필터는 대체 누가 만드는 거지?' 생각해 본 적 없어?
막 얼굴에 막 반짝이가 쏟아지고, 눈에서 빔이 나가고, 갑자기 선글라스가 씌워지는 그런 거 말이야.
그거, 생각보다 우리가 먼 세상 얘기가 아니야. 맞아, 바로 네가 직접 만들 수 있다는 소리야!
‘에이, 내가 무슨 개발자도 아니고...’ 하는 생각, 잠시만 접어둬 봐. 요즘엔 코딩 한 줄 몰라도 멋진 필터를 뚝딱 만들어낼 수 있는 툴도 많고, 조금만 더 욕심내면 내 상상력을 코드로 완벽하게 구현할 수도 있거든.
이 글은 바로 그런 너를 위한 길잡이가 되어줄 거야. '영상편집/제작' 카테고리에 딱 맞는 주제지? 단순한 영상 편집을 넘어서, 영상의 소스가 되는 카메라 화면 자체를 실시간으로 바꿔버리는 마법이니까. 우리가 함께할 여정은 이래.
1. **얼굴 필터, 대체 무슨 원리로 작동하는 걸까?** (마법의 비밀을 파헤쳐 보자!) 2. **뭘로 만들어? 개발 환경 세팅하기** (장비부터 챙겨야지!) 3. **코딩 없이 5분 만에 필터 만들기 (feat. Meta Spark AR)** (일단 맛부터 보자고!) 4. **코드로 직접 만드는 나만의 필터 (feat. Python & MediaPipe)** (진짜 실력자가 되어보자!) 5. **필터를 '힙'하게 만드는 디테일** (디테일이 퀄리티를 만든다!)
이 글을 끝까지 따라오면, 넌 더 이상 필터를 '소비'만 하는 사람이 아니라, '창조'하는 사람이 되어 있을 거야. 친구들한테 "이 필터? 내가 만든 건데, 한번 써볼래?" 하고 으쓱할 수 있게 되는 거지. 자, 그럼 심호흡 한번 하고, 인싸력 풀충전하러 가볼까?
얼굴 필터, 대체 무슨 원리야?
우리가 '필터'라고 부르는 것의 정식 명칭은 사실 **'증강현실(Augmented Reality, AR)'** 기술이야.
현실 세계에 가상의 이미지나 정보를 덧씌워서 보여주는 거지. 포켓몬고 생각하면 바로 이해될걸? 현실 길거리에 포켓몬이 나타나는 것처럼, 현실 내 얼굴 위에 가상의 그래픽(안경, 모자, 화장 등)을 덧씌우는 거야.
그럼 컴퓨터는 어떻게 내 얼굴을 알아보고, 내가 고개를 돌리거나 윙크를 해도 찰떡같이 그래픽을 따라오게 만드는 걸까? 여기에는 몇 가지 핵심적인 컴퓨터 비전(Computer Vision) 기술이 숨어있어.
잠깐, 컴퓨터 비전(Computer Vision)이 뭔데?
말 그대로 컴퓨터(Computer)에게 인간처럼 보는(Vision) 능력을 주는 인공지능의 한 분야야. 사진이나 영상에서 사물을 인식하고, 사람을 구별하고, 상황을 이해하게 만드는 모든 기술을 포함해. 자율주행 자동차가 차선을 인식하고, 스마트폰이 사진 속 인물을 자동으로 태그하는 것도 다 컴퓨터 비전 덕분이지.
얼굴 필터는 크게 4단계의 과정을 거쳐서 우리 눈에 보이게 돼.
1단계: 얼굴 찾기 (Face Detection)
가장 먼저 할 일은 카메라에 들어온 영상 프레임(수많은 사진의 연속이라고 생각해 봐)에서 '얼굴'이 어디 있는지를 찾아내는 거야.
컴퓨터는 학습된 수많은 얼굴 데이터를 기반으로 "음, 이 영역은 눈, 코, 입의 형태를 보니 사람이 얼굴 같군!" 하고 네모난 박스를 그려. 이걸 '바운딩 박스(Bounding Box)'라고 해.
2단계: 얼굴 특징점 찾기 (Facial Landmark Detection)
얼굴의 위치를 찾았다고 해서 바로 안경을 씌울 수는 없잖아. 눈이 어디고 코가 어딘지 정확히 알아야지.
이 단계에서는 얼굴의 주요 특징점들을 콕콕 찍어내는 거야. 눈썹, 눈꼬리, 콧방울, 입술선, 턱선 등등... 보통 수십 개에서 많게는 수백 개의 점(Landmark)을 찾아내. 이 점들이 모여서 얼굴의 3D 구조와 표정을 파악할 수 있는 '얼굴 지도(Face Mesh)'를 만드는 거지.
3단계: 추적하기 (Tracking)
영상은 계속 움직이잖아. 내가 고개를 까딱하거나, 웃거나, 찡그릴 때마다 얼굴과 특징점의 위치, 각도, 거리가 계속 변해. 추적 기술은 이 변화를 매 프레임마다 놓치지 않고 따라가는 역할을 해. 덕분에 필터가 내 얼굴에 딱 붙어서 자연스럽게 움직이는 것처럼 보이는 거지. 만약 추적 성능이 안 좋으면? 필터가 얼굴에서 따로 놀거나 버벅거리는 현상이 발생하는 거야.
4단계: 덧씌우기 (Rendering)
자, 이제 모든 좌표값이 준비됐어. 마지막으로 이 좌표에 맞춰서 우리가 준비한 그래픽(3D 안경 모델, 반짝이 파티클, 메이크업 텍스처 등)을 화면에 '그려주면' 끝! 이 과정을 렌더링이라고 해.
이 모든 과정(1~4단계)이 우리가 눈치채지 못할 만큼 아주 짧은 시간 안에(보통 1초에 30~60번) 반복되면서 실시간 얼굴 필터가 완성되는 거야. 정말 놀랍지 않아?
정리하자면, 얼굴 필터는 **'찾고(Detect), 점 찍고(Landmark), 따라가서(Track), 그리는(Render)'** 과정의 무한 반복이라고 할 수 있어. 이 기본 원리만 이해하면 앞으로 우리가 다룰 툴이나 코드가 훨씬 쉽게 느껴질 거야.
뭘로 만들어? 개발 환경 세팅 A to Z
원리를 알았으니 이제 직접 만들어 볼 차례지. "그래서 뭘로 만드는데?"라는 질문에 답을 해줄게.
얼굴 필터를 만드는 방법은 크게 두 가지 길이 있어. 하나는 전문가들이 만들어 놓은 길을 따라 편하게 가는 방법, 다른 하나는 내가 직접 길을 개척하며 나아가는 방법이야.
1. 플랫폼 제공 툴 사용하기 (초심자 추천! 쉽고 빠른 길)
인스타그램, 스냅챗, 틱톡 같은 거대 플랫폼들은 자신들의 앱에서 사용할 수 있는 필터를 누구나 쉽게 만들 수 있도록 전용 제작 툴을 무료로 제공해. 코딩을 거의 또는 전혀 몰라도, 마우스 클릭 몇 번과 약간의 감각만 있으면 꽤 그럴듯한 필터를 만들 수 있어.
-
Meta Spark AR Studio: 인스타그램과 페이스북 필터를 만들 때 사용하는 툴이야. 사용자층이 가장 넓고, 커뮤니티와 자료가 풍부해서 입문용으로 가장 많이 추천돼. 우리도 이따가 이걸로 필터를 만들어 볼 거야.
-
Snap Lens Studio: 스냅챗용 필터를 만드는 툴. AR 기술의 원조 맛집답게 강력하고 재미있는 기능이 많아. 북미나 유럽 쪽 사용자들을 타겟으로 한다면 좋은 선택이야.
-
TikTok Effect House: 숏폼의 제왕, 틱톡의 필터 제작 툴. 비교적 후발주자지만, 틱톡의 트렌드와 문법에 맞는 독특한 기능들을 빠르게 추가하고 있어. 챌린지나 밈(Meme)과 결합된 필터를 만들고 싶다면 주목해야 할 툴이지.
장점과 단점은?
✅ **장점**: 배우기 쉽다, 코딩이 필요 없다, 직관적인 인터페이스, 내가 만든 필터를 수억 명의 사용자에게 바로 배포할 수 있다.
❌ **단점**: 해당 플랫폼에서만 사용 가능하다, 정해진 기능 외의 아주 세밀한 커스터마이징에는 한계가 있다.
2. 코드로 직접 개발하기 (개발자 지망생! 자유도 끝판왕)
플랫폼의 틀에 갇히고 싶지 않다면, 혹은 나만의 앱이나 웹 서비스에 필터 기능을 넣고 싶다면 코드로 직접 구현하는 방법을 선택해야 해. 이건 좀 더 깊은 공부가 필요하지만, 상상할 수 있는 거의 모든 것을 제한 없이 구현할 수 있다는 엄청난 장점이 있어.
-
언어: 주로 **파이썬(Python)**이나 **자바스크립트(JavaScript)**를 사용해. 파이썬은 강력한 라이브러리가 많아서 인공지능/컴퓨터 비전 분야의 표준처럼 쓰이고, 자바스크립트는 웹 브라우저에서 바로 동작하는 필터를 만들 때 필수적이야.
-
핵심 라이브러리:
-
OpenCV: '컴퓨터 비전의 성경'이라고 불리는 오픈소스 라이브러리. 카메라를 제어하고, 이미지/영상을 불러와서 자르고 붙이고 색을 바꾸는 등 거의 모든 기본 작업을 할 수 있어. 필터 개발의 기반이 되는 뼈대 같은 존재야.
-
MediaPipe: 구글이 만든 괴물 같은 라이브러리. 우리가 앞에서 말한 '얼굴 특징점 찾기'를 엄청나게 빠르고 정확하게 해주는 모델을 그냥 가져다 쓸 수 있게 해줘. 얼굴뿐만 아니라 손, 전신 자세, 사물 인식 등 다양한 기능을 제공해서 AR 개발의 난이도를 확 낮춰준 일등공신이야. 이따가 코딩 실습에서 주인공으로 활약할 녀석이지.
-
dlib: MediaPipe가 나오기 전에 얼굴 특징점 검출의 강자로 군림했던 라이브러리. 여전히 특정 상황에서는 강력한 성능을 보여주지만, 요즘엔 설치와 사용이 더 간편한 MediaPipe를 선호하는 추세야.
-
그래서 뭘로 시작하라고?
나의 추천은 **'Spark AR로 시작해서, 흥미가 생기면 Python + MediaPipe로 넘어가라!'** 야.
Spark AR 같은 툴로 필터 제작의 전체적인 흐름과 감을 익히는 게 중요해. '아, 얼굴을 추적해서 그 위에 3D 모델을 올리는 거구나', '입을 벌리면 이미지가 바뀌게 할 수도 있네?' 같은 개념을 먼저 체험하는 거지. 그러다 보면 '아, 이건 내가 원하는 대로 좀 더 세밀하게 바꾸고 싶은데...' 하는 욕심이 생길 거야. 바로 그때가 코딩의 세계로 넘어올 타이밍이야!
실전! Meta Spark AR로 5분 만에 필터 뚝딱!
백문이 불여일견! 말로만 듣는 것보다 직접 한번 해보는 게 최고지.
지금부터 코딩 한 줄 없이, 인스타그램에서 쓸 수 있는 간단한 '선글라스 씌우기' 필터를 만들어 볼 거야. Meta Spark AR Studio만 설치하면 돼. 겁먹지 말고 천천히 따라와 봐!
Step 1. Spark AR Studio 설치 및 새 프로젝트 만들기
먼저 구글에 'Meta Spark AR'을 검색해서 공식 홈페이지로 들어가. 프로그램을 다운로드하고 설치해 줘. 페이스북 계정으로 로그인하면 돼.
설치가 끝나고 프로그램을 실행하면 여러 가지 템플릿이 보일 거야. 우리는 기본부터 배울 거니까 **Blank Project (빈 프로젝트)**를 선택하고 'Create' 버튼을 눌러줘.
Step 2. 인터페이스 둘러보기
프로그램을 켜면 좀 복잡해 보일 수 있는데, 딱 3가지만 기억하면 돼.
-
① 씬(Scene) 패널 (왼쪽): 필터를 구성하는 요소(오브젝트)들이 목록으로 보이는 곳이야. 포토샵의 레이어 패널이랑 비슷해. 여기에 '얼굴 추적기', '3D 안경' 같은 걸 추가하게 될 거야.
-
② 인스펙터(Inspector) 패널 (오른쪽): 씬 패널에서 뭔가를 선택하면, 그것의 세부 속성(크기, 위치, 회전, 색상 등)을 조절할 수 있는 창이 오른쪽에 떠. 여기서 디테일을 만지는 거지.
-
③ 에셋(Assets) 패널 (왼쪽 아래): 필터에 사용할 재료들(3D 모델, 이미지, 사운드 파일 등)을 보관하는 창고야.
Step 3. 얼굴 추적기 (Face Tracker) 추가하기
자, 이제 진짜 시작이야. 먼저 우리 필터가 얼굴을 따라다니게 만들어야겠지?
씬(Scene) 패널에서 마우스 오른쪽 버튼을 클릭하고, **Add Object > Face Tracker** 를 선택해. (또는 왼쪽 아래 '+ Add Object' 버튼을 눌러도 돼)
이거 하나 추가하는 것만으로, Spark AR은 이제 카메라 영상에서 얼굴을 찾고 그 움직임을 추적하기 시작해. 벌써 핵심 기능의 절반이 끝난 거야! 씬 패널에 'faceTracker0' 이라는 게 생겼을 거야.
Step 4. 3D 선글라스 가져오고 배치하기
이제 얼굴 위에 씌울 선글라스를 가져올 차례야.
왼쪽 아래 에셋(Assets) 패널 옆에 있는 **AR Library** 아이콘(상자 모양)을 클릭해. 여긴 Spark AR이 무료로 제공하는 방대한 양의 3D 모델, 사운드, 텍스처 등이 있는 보물창고야.
검색창에 'glasses' 라고 검색해 봐. 마음에 드는 선글라스를 고르고 'Import Free' 버튼을 눌러. 에셋 패널에 방금 가져온 선글라스 모델이 추가된 게 보일 거야.
이제 이 선글라스를 에셋 패널에서 마우스로 쭉 끌어서, 씬 패널에 있는 **'faceTracker0' 위에** 올려놔. 이게 중요해! 이렇게 'faceTracker0'의 자식으로 만들어야 선글라스가 얼굴 추적기를 따라다니게 되거든.
중앙 미리보기 화면(Viewport)을 봐. 시뮬레이터 속 사람 얼굴에 선글라스가 떡하니 씌워졌을 거야! 근데 위치나 크기가 좀 어색하지? 이제 이걸 조절할 차례야.
Step 5. 위치, 크기, 회전 조절하기
씬 패널에서 방금 추가한 선글라스 모델을 클릭해. 그럼 미리보기 화면에 파란색, 초록색, 빨간색 화살표와 네모, 원이 나타날 거야.
- **화살표 (Move Tool)**: 클릭하고 드래그해서 위치를 옮길 수 있어.
- **네모 (Scale Tool)**: 클릭하고 드래그해서 크기를 조절할 수 있어.
- **원 (Rotate Tool)**: 클릭하고 드래그해서 각도를 조절할 수 있어.
이 도구들을 이용해서 선글라스가 얼굴에 자연스럽게 맞도록 위치와 크기를 조절해 줘. 오른쪽 인스펙터 패널에서 직접 숫자를 입력해서 더 정밀하게 조절할 수도 있어.
Step 6. 테스트하고 공유하기
어때, 그럴듯한 필터가 완성됐지? 이제 잘 작동하는지 테스트해 보자.
왼쪽 툴바에서 카메라 모양 아이콘을 누르면 다양한 인종과 성별의 시뮬레이터 영상으로 바꿔보면서 테스트할 수 있어. 내 얼굴로 직접 테스트하고 싶다면? 핸드폰 모양의 **'Test on device'** 아이콘을 눌러봐. Spark AR Player 라는 앱을 폰에 설치하면, PC에서 만들고 있는 필터를 내 폰으로 실시간 전송해서 테스트할 수 있어. 정말 편하지?
만족스러운 필터가 완성됐다면, 오른쪽 아래 **'Publish'** 버튼을 눌러서 인스타그램에 올릴 수 있어. 필터 이름, 아이콘, 미리보기 영상 등을 등록하고 심사를 요청하면, 보통 며칠 내로 승인되어서 전 세계 사람들이 네가 만든 필터를 사용할 수 있게 돼!
봐, 코딩 한 줄 안 썼는데 5분 만에 (물론 처음이면 조금 더 걸리겠지만) 필터 하나를 뚝딱 만들었잖아. 이런 식으로 3D 모자, 귀걸이, 가면 등을 추가하거나, 얼굴에 그림을 그리는 'Face Mesh' 기능을 활용하면 무궁무진한 필터를 만들 수 있어. 일단 이렇게 쉬운 것부터 시작하면서 자신감을 얻는 게 중요해!
코딩으로 직접 만드는 나만의 필터 (feat. Python & MediaPipe)
Spark AR로 필터의 맛을 봤다면, 이제 진짜 실력을 한 단계 업그레이드할 시간이야.
이번에는 파이썬(Python)과 MediaPipe 라이브러리를 사용해서, 내 컴퓨터에서 직접 돌아가는 실시간 얼굴 필터를 만들어 볼 거야. 플랫폼 툴보다 조금 더 복잡하지만, 그만큼 자유도가 높고 컴퓨터 비전의 핵심 원리를 몸으로 직접 느낄 수 있는 귀중한 경험이 될 거야.
"헉, 갑자기 코딩이라니..." 하고 쫄 필요 없어. 최대한 쉽게, 한 줄 한 줄 어떤 의미인지 설명해 줄게. 파이썬이 처음이라도 괜찮아. '아, 이런 흐름으로 만들어지는구나' 하고 이해하는 것만으로도 엄청난 발전이니까.
준비물 챙기기
1. **Python 설치**: 구글에 'python'을 검색해서 공식 홈페이지에서 최신 버전을 설치해 줘. 설치할 때 'Add Python to PATH' 옵션을 꼭 체크해야 터미널에서 편하게 쓸 수 있어.
2. **라이브러리 설치**: 윈도우에서는 '명령 프롬프트(cmd)'나 'PowerShell'을, 맥에서는 '터미널'을 열고 아래 명령어를 한 줄씩 입력하고 엔터를 쳐줘.
pip install opencv-python
pip install mediapipe
`pip`는 파이썬의 라이브러리를 쉽게 설치해 주는 프로그램이야. `opencv-python`은 카메라를 다루고 이미지를 처리하는 데 필요하고, `mediapipe`는 얼굴 특징점을 찾는 마법을 부려줄 녀석이지. 이 두 개만 있으면 기본 준비는 끝!
자, 이제부터 코드를 단계별로 만들어 볼 거야. 전체 코드를 한 번에 보여주면 머리 아프니까, 차근차근 기능을 추가해 나가는 방식으로 진행할게.
Step 1. 웹캠 켜고 내 얼굴 보기
가장 먼저 할 일은 파이썬으로 내 컴퓨터의 웹캠을 켜고, 그 화면을 창에 띄우는 거야. 이게 모든 실시간 영상 처리의 시작이야.
import cv2 # OpenCV 라이브러리를 cv2라는 이름으로 불러옴
# 웹캠을 열기 (0은 보통 내장 웹캠을 의미)
cap = cv2.VideoCapture(0)
while True: # 무한 반복
# 웹캠에서 한 프레임(사진 한 장)씩 읽어오기
# success는 성공 여부(True/False), image는 실제 이미지 데이터
success, image = cap.read()
if not success: # 프레임을 읽어오는데 실패했다면
print("웹캠을 찾을 수 없습니다.")
break # 반복문 탈출
# 읽어온 이미지를 'My Face'라는 이름의 창에 보여주기
cv2.imshow('My Face', image)
# 'q' 키를 누르면 창이 닫히도록 설정 (1밀리초 동안 키 입력을 기다림)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release() # 사용한 웹캠 자원 해제
cv2.destroyAllWindows() # 모든 창 닫기이 코드를 `webcam_test.py` 같은 이름으로 저장하고 실행해 봐. (터미널에서 `python webcam_test.py` 라고 입력) 그럼 'My Face'라는 제목의 창이 뜨고 네 얼굴이 보일 거야! `q` 키를 누르면 창이 닫혀. 신기하지? 이게 바로 OpenCV의 힘이야. 단 몇 줄만으로 웹캠 영상을 실시간으로 다룰 수 있게 된 거지.
Step 2. MediaPipe로 얼굴 특징점 찾아서 그리기
이제 마법을 부릴 시간이야. 방금 만든 코드에 MediaPipe를 추가해서, 웹캠 영상 속 내 얼굴에 468개의 특징점을 실시간으로 그려볼 거야.
import cv2
import mediapipe as mp # MediaPipe 라이브러리를 mp라는 이름으로 불러옴
# MediaPipe의 드로잉 유틸리티와 얼굴 메쉬 모델을 준비
mp_drawing = mp.solutions.drawing_utils
mp_face_mesh = mp.solutions.face_mesh
# 웹캠 열기
cap = cv2.VideoCapture(0)
# Face Mesh 모델 초기화
# with 구문은 자원을 안전하게 사용하고 자동으로 해제해줌
with mp_face_mesh.FaceMesh(
max_num_faces=1, # 최대 1개의 얼굴만 인식
refine_landmarks=True, # 눈, 입술 주변의 특징점을 더 정교하게 찾음
min_detection_confidence=0.5, # 얼굴이라고 판단하는 최소 신뢰도
min_tracking_confidence=0.5) as face_mesh:
while cap.isOpened():
success, image = cap.read()
if not success:
break
# 성능 향상을 위해 이미지를 읽기 전용으로 만들고, BGR을 RGB로 변환
image.flags.writeable = False
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# MediaPipe로 얼굴 메쉬 처리
results = face_mesh.process(image)
# 다시 화면에 그리기 위해 이미지를 쓰기 가능으로 만들고, RGB를 BGR로 변환
image.flags.writeable = True
image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
# 얼굴 특징점이 감지되었다면
if results.multi_face_landmarks:
for face_landmarks in results.multi_face_landmarks:
# 준비된 드로잉 유틸리티로 얼굴에 메쉬(연결선)와 점을 그림
mp_drawing.draw_landmarks(
image=image,
landmark_list=face_landmarks,
connections=mp_face_mesh.FACEMESH_TESSELATION, # 점들을 연결하는 선
landmark_drawing_spec=None, # 점은 그리지 않음
connection_drawing_spec=mp_drawing.DrawingSpec(color=(0,255,0), thickness=1, circle_radius=1) # 선 스타일
)
# 눈, 입술 등 더 세밀한 부분의 선을 그림
mp_drawing.draw_landmarks(
image=image,
landmark_list=face_landmarks,
connections=mp_face_mesh.FACEMESH_CONTOURS,
landmark_drawing_spec=None,
connection_drawing_spec=mp_drawing.DrawingSpec(color=(255,0,0), thickness=1, circle_radius=1)
)
# 좌우 반전시켜서 거울처럼 보이게 함
cv2.imshow('MediaPipe Face Mesh', cv2.flip(image, 1))
if cv2.waitKey(5) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()이 코드를 실행하면, 네 얼굴 위에 초록색과 파란색 선으로 이루어진 정교한 그물망(메쉬)이 씌워지는 걸 볼 수 있을 거야. 고개를 돌리거나 표정을 바꿔봐. 메쉬가 실시간으로 따라 움직이지? 이게 바로 AR 필터의 핵심 기술이야. 이제 우리는 얼굴의 모든 부위의 정확한 2D 좌표를 실시간으로 얻을 수 있게 된 거야!
Step 3. 특정 위치에 이미지 씌우기 (선글라스 필터 완성!)
이제 대망의 마지막 단계야. 얼굴 메쉬 좌표를 이용해서, 특정 위치(예: 두 눈 사이)에 우리가 원하는 이미지(선글라스)를 씌워볼 거야. 이 부분이 조금 까다로울 수 있지만, 원리를 이해하면 정말 재미있어.
먼저, 배경이 투명한 선글라스 이미지를 하나 구해서 코드 파일과 같은 폴더에 `sunglasses.png` 라는 이름으로 저장해 줘. (구글에 'sunglasses png' 검색하면 많이 나와)
핵심 아이디어는 이거야:
1. **기준점 정하기**: 선글라스를 어디에 위치시킬지 기준이 될 특징점을 정한다. (예: 왼쪽 눈 끝점, 오른쪽 눈 끝점) 2. **크기 계산하기**: 두 기준점 사이의 거리를 계산해서 선글라스의 너비로 사용한다. 이렇게 하면 얼굴이 카메라에 가까워지면 선글라스도 커지고, 멀어지면 작아져서 자연스러워. 3. **위치 계산하기**: 두 기준점의 중간 지점을 선글라스의 중심으로 정한다. 4. **이미지 합성하기**: 계산된 위치와 크기에 맞춰서 선글라스 이미지를 원본 영상 위에 '붙여넣기' 한다. 이때 투명한 배경은 빼고 선글라스 부분만 그려야 해.이 부분이 좀 어렵게 느껴진다면?
걱정 마. 이미지 합성과 좌표 계산은 컴퓨터 비전에서도 꽤 고급 기술에 속해. 처음부터 완벽하게 이해하기는 쉽지 않아. 만약 이 부분이 너무 어렵다면, **재능넷** 같은 플랫폼에서 파이썬이나 OpenCV 전문가에게 도움을 요청하거나 관련 강의를 찾아보는 것도 좋은 방법이야. 혼자 끙끙 앓는 것보다 훨씬 빠르게 성장할 수 있지!
자, 이제 최종 코드를 보자. 이전 코드에서 이미지를 합성하는 로직이 추가됐어.
import cv2
import mediapipe as mp
import numpy as np # 숫자 계산, 특히 행렬 연산을 위한 라이브러리
# MediaPipe 초기화 (이전 코드와 동일)
mp_drawing = mp.solutions.drawing_utils
mp_face_mesh = mp.solutions.face_mesh
# 선글라스 이미지 불러오기 (알파 채널 포함)
# cv2.IMREAD_UNCHANGED는 투명 배경(알파 채널)까지 읽어오는 옵션
sunglasses_orig = cv2.imread('sunglasses.png', cv2.IMREAD_UNCHANGED)
# 기준이 될 랜드마크 인덱스 (MediaPipe에서 정해놓은 번호)
# 226번: 왼쪽 눈의 왼쪽 끝, 446번: 오른쪽 눈의 오른쪽 끝
LEFT_EYE_END_INDEX = 226
RIGHT_EYE_END_INDEX = 446
# 웹캠 열기
cap = cv2.VideoCapture(0)
with mp_face_mesh.FaceMesh(
max_num_faces=1,
refine_landmarks=True,
min_detection_confidence=0.5,
min_tracking_confidence=0.5) as face_mesh:
while cap.isOpened():
success, image = cap.read()
if not success:
break
# MediaPipe 처리 (이전 코드와 동일)
image.flags.writeable = False
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
results = face_mesh.process(image_rgb)
image.flags.writeable = True
if results.multi_face_landmarks:
for face_landmarks in results.multi_face_landmarks:
# 랜드마크 좌표는 0~1 사이의 값이라, 실제 픽셀 좌표로 변환 필요
ih, iw, _ = image.shape
# 왼쪽 눈, 오른쪽 눈 끝점의 픽셀 좌표 얻기
left_eye_pt = face_landmarks.landmark[LEFT_EYE_END_INDEX]
right_eye_pt = face_landmarks.landmark[RIGHT_EYE_END_INDEX]
left_x, left_y = int(left_eye_pt.x * iw), int(left_eye_pt.y * ih)
right_x, right_y = int(right_eye_pt.x * iw), int(right_eye_pt.y * ih)
# 1. 선글라스 너비 계산
sunglasses_width = int(np.linalg.norm([right_x - left_x, right_y - left_y]))
# 2. 선글라스 높이 계산 (원본 비율 유지)
orig_h, orig_w, _ = sunglasses_orig.shape
sunglasses_height = int(sunglasses_width * (orig_h / orig_w))
# 3. 선글라스 크기 조절
sunglasses = cv2.resize(sunglasses_orig, (sunglasses_width, sunglasses_height))
# 4. 선글라스 위치 계산 (두 눈의 중심)
center_x = (left_x + right_x) // 2
center_y = (left_y + right_y) // 2
# 이미지를 붙여넣을 좌상단 좌표 계산
top_left_x = center_x - sunglasses_width // 2
top_left_y = center_y - sunglasses_height // 2
# --- 이미지 합성 (조금 복잡한 부분) ---
# 선글라스 이미지에서 알파 채널(투명도)을 마스크로 분리
sunglasses_gray = cv2.cvtColor(sunglasses, cv2.COLOR_BGR2GRAY)
_, alpha_mask = cv2.threshold(sunglasses_gray, 25, 255, cv2.THRESH_BINARY)
# 원본 이미지에서 선글라스를 붙일 영역(ROI)을 지정
roi = image[top_left_y: top_left_y + sunglasses_height, top_left_x: top_left_x + sunglasses_width]
# 마스크를 이용해서 ROI에서 선글라스 모양만 검게 만들기
# bitwise_and 연산은 두 이미지에서 모두 0이 아닌 픽셀만 남김
background = cv2.bitwise_and(roi, roi, mask=cv2.bitwise_not(alpha_mask))
# 선글라스 이미지에서 배경은 제거하고 선글라스 부분만 남기기
foreground = cv2.bitwise_and(sunglasses, sunglasses, mask=alpha_mask)
# 배경과 선글라스를 합치기
# cv2.add는 두 이미지를 더함. 검은색(0) + 색상 = 색상
final_roi = cv2.add(background, foreground[:,:,:3])
# 원본 이미지에 최종 합성된 ROI를 다시 붙여넣기
image[top_left_y: top_left_y + sunglasses_height, top_left_x: top_left_x + sunglasses_width] = final_roi
# --- 이미지 합성 끝 ---
cv2.imshow('My Sunglasses Filter', cv2.flip(image, 1))
if cv2.waitKey(5) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()이 코드를 실행하면... 짜잔! 네 얼굴에 선글라스가 씌워졌을 거야! 얼굴을 가까이하거나 멀리해 봐. 선글라스 크기가 자연스럽게 변하는 걸 볼 수 있어. (아직 고개를 기울이는 건 반영 못 했지만, 그것도 삼각함수를 이용하면 구현 가능해!) 어때, 네가 직접 코드로 만든 필터야! 정말 뿌듯하지 않아?
필터를 '힙'하게 만드는 디테일
기본적인 필터를 만드는 법을 배웠다고 끝이 아니야. 수많은 필터 속에서 내 필터가 돋보이려면 '디테일'이 필요해. 사람들을 "와, 이 필터 대박이다!" 하게 만드는 차이는 바로 이런 작은 디테일에서 나와.
1. 미학, 결국은 디자인 싸움
아무리 기술이 뛰어나도, 안 예쁘면 아무도 안 써. 이건 진리야.
필터는 결국 시각적인 경험이야. 색 조합, 3D 모델의 퀄리티, 텍스처의 질감 하나하나가 필터의 전체적인 무드를 결정해. 촌스러운 네온 컬러 대신 부드러운 파스텔 톤을 쓴다거나, 저화질 이미지 대신 고해상도의 세련된 그래픽을 사용하는 것만으로도 필터의 격이 달라져. 평소에 예쁜 디자인, 좋은 색감의 레퍼런스를 많이 봐두는 게 큰 도움이 돼.
2. 인터랙션: 사용자와 소통하기
단순히 얼굴에 뭐가 씌워지는 걸 넘어서, 사용자의 행동에 반응하는 필터는 훨씬 더 재미있고 매력적이야. 이걸 '인터랙션'이라고 해.
-
표정 트리거(Trigger): 사용자가 입을 벌리면 갑자기 불을 뿜거나, 윙크를 하면 하트가 뿅뿅 날아가는 식의 효과를 말해. Spark AR에서는 'Patch Editor'라는 노드 기반의 비주얼 스크립팅 툴로 쉽게 구현할 수 있고, 코딩으로는 입술 위아래 랜드마크 사이의 거리나 눈꺼풀 랜드마크의 변화를 감지해서 만들 수 있어.
-
화면 터치: 화면을 터치하면 필터 효과가 바뀌거나(예: 선글라스 색상 변경), 새로운 오브젝트가 나타나게 만들 수도 있어. 사용자에게 선택권을 주는 거지.
-
물리 엔진: 머리 위에 올린 장식이 그냥 딱 붙어있는 게 아니라, 고개를 흔들면 살짝 출렁거리거나 통통 튀는 효과를 주면 훨씬 생동감 있어 보여. 이런 걸 물리 효과라고 해.
3. 사운드 디자인: 귀를 즐겁게
영상 제작에서 사운드가 절반이라는 말이 있듯이, 필터에서도 사운드는 정말 중요해.
특정 행동을 할 때마다 "뿅!", "반짝!" 같은 효과음이 나면 필터의 재미가 두 배가 돼. 배경에 잔잔한 음악을 깔아서 필터의 분위기를 고조시킬 수도 있지. 시각 효과와 청각 효과가 시너지를 낼 때, 사용자는 필터에 더 깊이 몰입하게 돼.
4. 컬러 그레이딩 (LUT): 필터의 화룡점정
이건 정말 고급 기술이자, 필터의 분위기를 한 방에 바꾸는 치트키야. **LUT(Look-Up Table)**는 '색상 보정표'라고 생각하면 쉬워. 영상의 전체적인 색감을 특정 스타일(예: 필름 카메라 느낌, 사이버펑크의 네온 느낌, 따뜻한 가을 느낌 등)로 한 번에 바꿔주는 필터 속의 필터 같은 존재지.
포토샵이나 라이트룸, 영상 편집 프로그램(프리미어 프로, 다빈치 리졸브)에서 원하는 색감의 LUT 파일을 만들거나, 인터넷에서 무료로 배포되는 LUT 파일을 다운로드해서 Spark AR나 코드에 적용할 수 있어. 그냥 내 얼굴만 나오는 영상이 아니라, 마치 한 편의 영화처럼 보이게 만드는 마법이야. 이건 '영상편집/제작' 카테고리와도 직접적으로 연결되는 아주 중요한 기술이야.
5. 최적화: 부드러움이 생명
아무리 화려하고 멋진 필터라도, 실행했을 때 버벅거리거나 폰이 뜨거워지면 바로 외면당해. 최적화는 필터 제작의 기본 예의야.
- **리소스 용량**: 사용하는 3D 모델의 폴리곤(면) 개수, 텍스처 이미지의 해상도와 파일 크기를 최대한 줄여야 해.
- **코드 효율성**: 코드로 필터를 만든다면, 불필요한 반복 계산을 줄이고 효율적인 알고리즘을 사용해야 해.
이런 디테일들을 챙기기 시작하면, 너는 그냥 '필터 만드는 사람'이 아니라 '훌륭한 AR 경험을 디자인하는 크리에이터'로 거듭나게 될 거야.
이제 너도 AR 크리에이터!
와, 여기까지 따라오다니 정말 대단해! 👏
우리는 오늘 얼굴 필터가 어떤 원리로 작동하는지 그 비밀을 파헤쳤고, Spark AR이라는 쉬운 툴로 직접 필터를 만들어봤어. 심지어 파이썬과 MediaPipe라는 전문적인 도구를 사용해서 코드로 나만의 필터를 구현하는 경험까지 했지.
이제 넌 더 이상 인스타그램 속 필터를 보며 신기해하기만 하는 사람이 아니야. 그 필터가 어떻게 만들어지는지 알고, 직접 만들 수 있는 능력을 갖춘 **'AR 크리에이터'**의 첫발을 내디딘 거야.
여기서 멈추지 마. 오늘 배운 건 기본일 뿐이야. 이제부터가 진짜 시작이지.
-
얼굴뿐만 아니라 **손이나 전신을 추적하는 필터**를 만들어보는 건 어때? MediaPipe는 손가락 마디마디와 전신 관절을 추적하는 기능도 제공해. 허공에 그림을 그리거나, 내 동작을 따라 하는 아바타를 만들 수도 있어.
-
현실 공간을 인식해서 **바닥에 3D 동물을 소환하거나 벽에 그림을 거는 필터**도 도전해볼 수 있어. 이건 SLAM(Simultaneous Localization and Mapping)이라는 한 단계 더 나아간 AR 기술인데, Spark AR에서도 지원하는 기능이야.
아이디어가 떠오르면 주저하지 말고 일단 만들어봐. 실패해도 괜찮아. 그 과정에서 배우는 게 훨씬 더 많을 테니까. 막히는 부분이 있다면 구글링을 하거나, 유튜브 튜토리얼을 찾아보거나, 개발자 커뮤니티에 질문을 올려봐. 세상에는 너와 같은 길을 가는 친절한 사람들이 정말 많아.
그리고 너만의 독특한 필터 제작 스킬이 생겼다면, 그걸로 새로운 기회를 만들어보는 건 어때?
요즘엔 기업들이 자신들의 브랜드를 홍보하기 위해 전용 필터를 만드는 마케팅을 많이 해. 너의 크리에이티브가 필요한 곳이 많다는 뜻이지. **재능넷** 같은 플랫폼에 '인스타그램 AR 필터 제작' 전문가로 너의 재능을 등록해서 다른 사람이나 기업을 도와주며 수익을 창출할 수도 있어. 너의 상상력이 누군가에게는 멋진 결과물이 되고, 너에게는 보람과 수익으로 돌아오는 선순환을 만들 수 있는 거야.
세상은 너의 캔버스야. 이제 마음껏 너의 상상력을 펼쳐봐.
오늘 배운 기술들로 또 어떤 재미있고, 멋지고, 감동적인 경험을 만들어낼지 정말 기대된다. 너의 첫 번째 작품을 기다리고 있을게!
댓글 작성
이 글에 대한 여러분의 생각을 들려주세요
로그인이 필요합니다
댓글을 작성하려면 먼저 로그인해주세요.
댓글 0
지식인의 숲 - 지적 재산권 보호 고지
지적 재산권 보호 고지
- 저작권 및 소유권: 본 컨텐츠는 재능넷의 독점 AI 기술로 생성되었으며, 대한민국 저작권법 및 국제 저작권 협약에 의해 보호됩니다.
- AI 생성 컨텐츠의 법적 지위: 본 AI 생성 컨텐츠는 재능넷의 지적 창작물로 인정되며, 관련 법규에 따라 저작권 보호를 받습니다.
- 사용 제한: 재능넷의 명시적 서면 동의 없이 본 컨텐츠를 복제, 수정, 배포, 또는 상업적으로 활용하는 행위는 엄격히 금지됩니다.
- 데이터 수집 금지: 본 컨텐츠에 대한 무단 스크래핑, 크롤링, 및 자동화된 데이터 수집은 법적 제재의 대상이 됩니다.
- AI 학습 제한: 재능넷의 AI 생성 컨텐츠를 타 AI 모델 학습에 무단 사용하는 행위는 금지되며, 이는 지적 재산권 침해로 간주됩니다.
아직 댓글이 없습니다.