본문 바로가기
캡스톤

[OpenCV] 사진/동영상 배경제거 작업

by limsjin 2024. 11. 3.

캡스톤 작업을 간략히 말하자면,

객체 배경제거 - 모델링 - 텍스처 작업 순으로 진행될 예정이다. 작업 환경은 Springboot(기본)+ Flask(모델링)이다. 우선, 배경제거 파트를 맡아 진행했다. 배경제거는 OpenCV를 이용했으며 보통 rembg함수를 통해 이루어진다.

 

우선 사진의 경우, 배경제거가 수 초내로 잘 되었다.

하지만, 여러 이미지의 다양한 각도로 이루어진 동영상에서 배경제거를 하는 것은 쉽지않았다. 이미지 단위로 배경제거를 하고 다시 영상으로 합성해야했기 때문이다.

다양한 방법과 시도 끝에 만족스러운 결과물을 얻었다!ㅎㅎ 그래서, 그 과정을 기록하고 공유해보려 한다.

 

 

0. 사진 배경제거

사진 배경제거 전

 

이렇게 사진의 경우, 배경제거가 잘 되었음을 확인할 수 있다. (객체와 비슷한 색상의 배경도 잘 제거됨.)

 

 

다음, 동영상의 배경제거 시도들을 확인해 보자


 

 

영상을 합성할 때 색상정보가 예민하므로, 동영상이 푸르게 나오는 큰 문제점이 있었다.

(급한대로 그 자리에서 얼굴을 찍어 테스트해서 스티커를 붙여 올린다..ㅎ 추가로 시간이 되면 다른 예시 동영상으로 결과물을 올려보도록 하겠다!) 

다음은 원본 동영상 중 일부 사진이다.

<원본> //이후, 복잡한 책장배경이 잘 제거됨.

 

 

1. 첫번째 시도 :: 완성된 동영상에서 B (Blue) 채널 값을 줄이는 방식

 

푸르다

 

 

단순히 영상이 파랗게 나왔으니 영상의 전체적인 파란톤을 줄이는 방식은 어떨까? 하고 제일 기본적으로 시도해보았다.

그러나, 전체적으로 색상이 고정되는 문제점이 있었다. 또한, 완성된 후에 프레임마다 B 채널을 줄이기 위해 색상 보정을 다시 수행하기 때문에 시간이 매우 많이 소요 되었다. 대략. 10-12분 정도.. 실제로 앞으로 남은 모델링 단계동안 얼마나 더 시간소요가 될지, 얼마나 안좋은  ux를 제공할지 약간 두려웠다.

 

 

2. 두번째 시도 :: 동영상 생성 과정에서 동적으로 B 채널 비율 줄이기

 

영상이 전체적으로 색상고정이 되지 않기위해 영상이 완성된 이후가 아닌, 합성과정에서 동적으로 파란톤을 줄이면 어떨까 싶었다. 그러나 효과는 미미했으며, 여전히 프레임마다 보정을 실시했기 때문에 시간도 소요가 많이 되었다.

 

 

 

3. 세번째 시도 ::  원본 초반의 처음 색상을 가져와서 적용

 

원본과 비슷해지려나

 

나름 획기적인 아이디어라고 생각해서 결과물을 기대했던 시도이다. 초반의 색상정보만으로 다각도의 영상 전체를 담당하기엔 부족하였다. 그래서 중간중간 몸을 돌리는 등 동작을 바꿀때마다 색상정보가 없는 경우가 있었다. 시간적 측면에서는, 초반 색상 정보를 저장하는 과정에서 다소 시간이 걸리지만, 이후 프레임에는 동일한 색상 정보를 사용하여 적용하므로 연산이 줄어들었다. 대략 7분정도 소요되었다.

 

 

 

4. 네번째 시도 :: 알파 채널을 사용해 배경을 투명하게 처리하여 색상 조정을 생략하고 원본 색상을 유지

 

지금껏 그나마 제일 괜찮아 보이는 푸름 정도

 

객체 부분에 투명하게 알파채널을 적용하는 건데 연한 파란톤으로 그나마 나아진 효과를 볼 수 있었다. 또한, 프레임마다 색상 조정을 하지 않으므로, 그만큼 연산이 줄었다. 5-6분

 

 

 

5. 최종적으로 프레임을 PNG 이미지로 변환하여 개별 프레임의 원본 색상을 유지.

사진의 경우 배경제거가 잘 되었기 때문에, 영상을 합성할 때의 문제라고 판단했다. 그래서 현재, 프레임을 0.01초 단위로 나누어 배경제거된 사진을 추출하도록 하였다. 그랬더니 비율도 맞고 깔끔하게 배경제거된 사진을 얻을 수 있었다. 3-4분정도 소요

 

 

 

 

 

동영상에서도 만족스러운 결과물을 얻었지만 앞으로 더 좋은 퀄리티를 위해 동영상 배경제거 부분을 발전시켜갈 예정이다!! 배경제거 이후의 앞으로의 작업물도 많이 기대해 주세욯ㅎㅎ