
사진 한 장을 그대로 3D 영상으로 만들어내는 기술 — 깊이맵으로 흉내 낸 인스타그램의 3D 이미지
아마 처음 출시할때 구매했던것 같은데, 오큘러스 퀘스트2를 켜서 사용해보다가 우연히 인스타그램을 켜봤는데, 사진이며 동영상이 자동으로 3D로 변환되어 보이는 느낌이 들어 상당히 신기했다. 고개를 움직이면 앞에 있는 사람은 크게 밀리고 뒤 배경은 거의 안 움직인다. 아마 깊이 추정과 객체 분리를 통해서 구현하는것 같은데, 상당히 자연스럽기도 했고, 몇몇 사진에서는 한계를 보이기도 했다. VR 헤드셋으로 보니까 확실히 실감나고 너무 재미있어서 한참 피드를 내리면서 구경했다.
VR 헤드셋은 두 화면의 시차를 기본적으로 활용하기 때문에 일반적인 모니터에서 이것을 똑같이 표시하기는 상당히 어렵다. 예전 공포 책자에서 그림이 도드라져 보이게 하던 착시를 떠올렸고, 한쪽은 빨간색 다른쪽은 파란색 셀로판지 안경으로 튀어나오게 하던 애너글리프를 사용하기로 했다. 단일 화면에서 뇌를 속이는 기술이다. 예전에 소월로에서 찍은 사진 한 장을 이용해서 테스트해보기로 했다. 「ILLUSO COFFEE AND MUSIC」. 가게 이름도 이 프로젝트와 아주 잘 어울린다.
이 사진 한 장으로 인스타가 VR에서 하는 3D 레이어링을 흉내 내고 싶다. 단안 깊이추정으로 깊이맵을 만들고, 시선(마우스·기울임)에 따라 가까운 것은 많이, 먼 것은 적게 밀어서 입체감을 만드는 걸 브라우저에서 실시간으로 돌려달라. 출력은 HTML 한 장. 원본과 착시본이 나란히 보이면 좋겠다.
두 문장이다. 하지만 진짜 어려운 건 「깊이맵을 만든다」 한 줄에 숨어 있었다.
원본
먼저 손에 쥔 사진.

정면에서 건물을 바라본 구도다. 앞쪽 보도에 검은 옷을 입은 남자가 서 있고, 그 뒤로 벽돌 건물과 통유리, 활짝 열린 어두운 출입구가 있다. 사람이 가장 가깝고, 보도가 그다음, 건물 벽이 멀고, 열린 문 안쪽이 가장 깊다. 이 순서를 회색 지도로 옮기는 게 첫 일이다.
무엇이 나왔나
HTML 한 장이 나왔다. 원본과 나란히, 마우스를 올리면 장면이 시선을 따라 움직이는 착시본이 들어 있다. 지면에서는 움직임을 보여줄 수 없으니, 화면을 자동으로 좌우로 흔들었을 때의 모습을 짧은 반복 영상으로 옮겼다.

앞의 남자가 배경을 스치며 좌우로 미끄러진다. 반면 건물 벽과 간판은 거의 붙박이다. 이 이동량의 차이가 전부다. 뇌는 「가까운 게 더 빨리 움직인다」는 평생의 경험으로 이 차이를 깊이로 읽는다. 분할이 정밀하지는 않아서 조금 어색한 부분도 있지만 제법 잘 되는 느낌이다.
적청 안경이 있다면 다른 방식도 된다. 왼눈·오른눈 시차를 빨강과 청록으로 갈라 한 장에 겹친 애너글리프다. 연식이 좀 있으신 분들은 다 한번쯤 해봤을거다.

가까운 남자일수록 빨강·청록의 어긋남 폭이 넓고, 먼 건물은 좁다. 어긋남의 폭이 그대로 깊이다.
실제로 마우스를 움직이고 모드를 바꿔볼 수 있는 인터랙티브 버전은 여기 있다 — 👉 브라우저에서 직접 만져보기. PC는 마우스, 휴대폰은 기기를 기울이면 된다.
어떻게 굴러갔나
핵심은 깊이맵이다. 세 단계였다.
1. 깊이를 추정했다. MiDaS라는 단안 깊이추정 모델에 사진을 넣으면, 픽셀마다 얼마나 가까운지를 밝기로 칠한 지도가 나온다. 카메라 한 대로 찍은 평범한 사진에서 깊이를 짐작하는 모델이다.

2. 시선에 따라 픽셀을 밀었다. 나머지는 셰이더 한 줄이다. 화면의 각 픽셀을 원래 자리가 아니라 원래자리 + 시선방향 × 강도 × (그 픽셀의 깊이 − 기준면) 위치의 색으로 다시 칠한다. 가까운 픽셀은 기준면에서 멀어 많이 밀리고, 먼 픽셀은 적게 밀린다. 마우스가 움직일 때마다 이 계산을 60분의 1초마다 새로 한다. 인스타그램이 VR 헤드셋에서 하는 것과 같은 계산을, 화면 한 장에서 눈속임으로 하는 셈이다.
어디서 걸렸나
모델이 남자를 배경으로 착각했다. 처음 나온 깊이맵을 보고 웃었다. 보도와 건물의 원근은 그럴듯한데, 정작 주인공인 검은 옷의 남자가 어둡다는 이유로 「멀리」로 칠해져 배경에 파묻혀 있었다. 밝을수록 가깝다고 배운 모델에게 검은 재킷은 그냥 먼 그림자였던 것이다. 남자가 안 튀어나오면 이 놀이는 실패다.
그래서 남자만 따로 오려냈다. GrabCut이라는 고전적인 분리 기법으로 인물의 실루엣을 뽑아, 그 영역만 깊이맵에서 강제로 「가장 가깝게」 끌어올렸다. 위의 깊이맵에서 남자가 유독 새하얀 건 이 보정 때문이다. AI가 만든 초안을 사람이 한 군데 고쳐 완성한 셈인데, 이번 놀이에선 그 한 군데가 전부였다.
평면의 한계는 남는다. 단일 화면이라 결국 눈속임이다. 시선을 크게 움직이면 실루엣 가장자리가 조금 늘어나 보인다. 가려져 있던 뒤쪽 픽셀이 원래 없으니, 앞 물체가 비키면서 뒤를 지어내야 하기 때문이다. 헤드셋은 두 눈에 다른 그림을 줘서 이 문제를 덜지만, 모니터 한 장은 어쩔 수 없이 「그럴듯한 정도」에서 멈춘다. 그래도 가만히 두면 화면이 스스로 천천히 흔들리게 해뒀더니, 인스타에서 보던 그 은근한 떠 있음이 꽤 비슷하게 났다.
착시(illuso)라는 이름의 가게 앞에서, 평면 사진 한 장을 화면 밖으로 살짝 꺼내 봤다.
비전 알고리즘이나 시각 시스템에 대한 간단한 이해만 있다면 제법 재미있는 작업을 많이 해볼 수 있겠다는 생각이 든다. 여전히 제대로된 뭔가를 만들어내기는 힘들고 어렵지만 약간의 노하우와 노력이 더해진다면 충분히 상업 수준의 서비스를 만드는것도 가능해 보인다. 솔직히 이 과정이 딸깍으로 될 것 같아 보이지는 않는다.
오랜만에 VR 헤드셋과 인스타그램으로 제법 흥미로운 작업을 할 수 있어 좋았다. 다른 사진들도 한번씩 변환해보거나 인스타그램에 업로드해서 3D로 보면 좋을 것 같다.