Program/OPEN_CV

[Open CV] 영상 분할과 객체 검출 _ 실전코딩 ( 스노우앱 )

사막여유 2022. 6. 18. 10:06
728x90

2022.06.18 금일은 실전코딩 간단 스노우앱 만들기에  관한 강의였다.

 

 

간단 스노우앱?

 - 카메라 입력 영상에서 얼굴을 검출하여 재미있는 그래픽을 합성하는 프로그램

구현할 기능

 - 카메라 입력 영상에서 얼굴&눈 검출하기

 - 눈 위치와 맞게 투명한 PNG 파일 합성하기
   ( 안경의 알 사이의 거리를 적당히 resize 해서 합성 )

 - 합성된 결과를 동영상으로 저장하기

 

얼굴 & 눈 검출

 - 캐스케이드 분류기 사용
   XML 파일 다운로드 : https://github.com/opencv/opencv/tree/master/data/haarcascades
   얼굴 검출 XML 파일 : haarcascade_frontalface_alt2.xml
   눈 검출 XML 파일 : haarcascade_eye.xml

 

눈 위치와 맞게 투명한 PNG 파일 합성하기

 - 사용할 PNG 파일 : glasses.png 

 - PNG 영상 크기 조절 및 위치 계산
   입력 영상에서 두 눈 사이의 거리에 맞게 PNG 안경 영상 크기를 Resize
   왼쪽 눈 위치가 일치하도록 PNG 영상의 합성 위치를 계산

 - 합성방식
   Alpha 채널 값이 255면 완전한 불투명, 0이면 완전한 투명, 중간값이면 가중합 연산

 

 

실제 소스 코드를 보면서 다시 설명해본다.

 

일단 cv2.VideoCapture로 웹캠을 실행시켜준 뒤 

카메라의 프레임 크기를 w,h 로 받아온다.

 

그리고 합성된 결과를 output.avi 파일로 저장하는 코드를 작성한다.

그리고 얼굴과 눈 검출하기위한 XML 파일을 열어준다.

합성을 진행할 glasses 파일을 열어준다. 

 

glasses 파일을 보게되면 눈썹 부분과 콧수염 부분의 삐죽삐죽 튀어나와있는 부분들이Alpha 채널에서 0또는 255의 값이 아닌 그 중간단계로 구성이 되어있다.

 

그래서 만약 위 영상을 단순하게 CopyTo 로 합성하게 된다면 아래와같이 부자연스러운 부분이 생기기때문에

가중 연산으로 계산해줘야 자연스럽게 합성이 될 수 있다.

 

일단 이렇게 PNG 파일을 열었으면 

glasses 의 왼쪽 눈과 오른쪽 눈 좌표를 가져와준다.
( 미리 좌표 계산 )

간격이 420 pixel 정도 되는데 추후 resize 할때 위 간격을 사용하여 resize 하도록 한다.

 

그리고 이전에 배웠던 강의를 참고하여 얼굴검출을 하는데 속도를 높이기 위해서 scale 을 1.2로 
minSize = (100,100) , maxSize = (400,400) 으로 설정해두었다.

이후 얼굴이 검출된 부분을 추출하여 그 부분의 상단 부분에서 눈검출을 한다.

그래서 눈 검출된 결과데이터에 눈검출한 이후의 눈위치에대한 사각형 정보가 나오게 되는데 
정상적인 얼굴의 위치 ( 정면 ) 라고 한다면 눈을 2개 검출하게 된다. 

그런데 2개가 정확히 검출되지 않을때가 있기 때문에 눈이 2개가 검출되지 않았으면 continue를 사용하여
무시하도록 진행한다.

 

 * 위 소스코드중 눈 위치를 검출한 eyes 라고 하는 결과데이터는 얼굴의 부분영상으로 추출한 값이기 때문에
   얼굴검출위치에 눈 검출 위치를 더해야지만 전체영상에서의 위치를 추출해낼 수 있다.

 * eyes[0][0] = 왼쪽눈의 x 위치
   eyes[0][1] = 왼쪽눈의 y 위치
   eyes[0][2] = 왼쪽눈의 가로크기
   eyes[0][3] = 오른쪽눈의 세로크기
   eyes[1][0] = 오른쪽 눈의 x 위치
   eyes[1][1] = 오른쪽 눈의 y 위치
   eyes[1][2] = 오른쪽 눈의 가로크기
   eyes[1][3] = 오른쪽 눈의 세로크기

 

현재 위 코드를 사용하여 얼굴 검출을 하게되면 상당히 떨리는 것을 느낄 수 있을텐데

추후 딥러닝을 사용하여 얼굴 검출을 하게되면 조금 더 안정적으로 검출되는 것을 볼 수 있다.

 

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.

https://bit.ly/3L3avNW

 

패스트캠퍼스 [직장인 실무교육]

프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.

fastcampus.co.kr

728x90