본문 바로가기
IT관련 정보

[2장] 라즈베리파이4 얼굴추적 카메라 완성

by mainspring 2020. 11. 4.

안녕하세요.

 

오랜만에 뵙습니다.

 

 

일단 포스팅을 하지않은 기간동안 정말 많은것들이 진행 되었습니다.

 

1. haar cascade 정면 + 옆면 동시에 인식되게 코드 수정 

 

2. 서보모터 및 팬틸트 더 큰걸로 바꾸기 

 

3. 3D 모델링 커버 완성

 

4. 얼굴이 인식되면 소리가 재생되게 만듬. (pygame 사용 www.pygame.org/docs/)

 

5. 사람이 인식되지않으면 천천히 제자리로 돌아오고, 소리가 재생중이면 중지됨.

 

 

등이 있습니다.

 

 

 

일단 1번부터 보겠습니다.

 

1번 정면 + 옆면 동시 검출시도

 

먼저 정면 하르 캐스케이드가 인식되지 않으면, 

옆면이 인식되게 xml파일을 사용했습니다. 예시 코드로 보면

faces = faceCascade.detectMultiScale(gray, scaleFactor=1.2,minNeighbors=5,minSize=(40, 40),maxSize=(400,400))
 
 
 
if not len(faces) :
faces = profaceCascade.detectMultiScale(gray, scaleFactor=1.2,minNeighbors=5,minSize=(40, 40),maxSize=(400,400))
#if there is no frontalface

 

먼저 페이스 캐스케이드로 정면을 검출하고, 만약 정면 검출이 한개도 없으면, 다시 proface (옆면)으로 검출을 시도 하는거죠. 

그러면, 정면일때 얼굴이 있으면 그대로 진행 , 정면이 없고 옆면얼굴이있으면 옆면 얼굴로 진행. 이런 순번입니다.

 

2. 더큰 서보모터 사용.

 

이부분은 MG996R 을 사용하엿고 팬틸트도 이에 맞춰 사용하엿습니다.

장점은 힘이 좋기에 (원래 자동차 바퀴용) 무거운 물체를 달수 있고, 팬틸트도 이에 맞춰 더욱 단단한 형태입니다.

 

 

 

둘다 국내 부품 판매 사이트에서 구매하실 수 있으십니다. 

참고로 추가로 더 구매해아하는 서보혼이 있는데 

www.devicemart.co.kr/goods/view?no=1357607

 

25T 서보모터용 20파이 서보 혼 MG995/MG996R 호환 [SZH- LMS002]

저렴한 25T 서보모터용 범용 서보 혼입니다. 서보모터와 기구물을 결합할 때에 사용합니다. 외경 : 20ø / 볼트길이 : 14mm / 볼트규격 : M3 / 축 규격 : 25T

www.devicemart.co.kr

이 서보혼 2개가 있어야 팬틸트와 MG996R 이 체결 가능해집니다. 잘 참고하시길!

 

 

 

3. 3D모델링 커버

 

이부분은 같이 협업하는 회사분이 도와주셨습니다. 

기존에 사용하고있는 sg-90 서보모터용 팬틸트가 아니라 더큰 서보모터를 사용했기에 그거에 맞춰 더욱 디자인이 커졌습니다. 

전체적인 디자인은 아직 보여드릴수 없지만 대충 위로 20cm되는 큰 타워형이라고 보시면 됩니다.

 

 

4. 얼굴이 인식되면 소리가 재생되게 - pygame 사용 . 

 

이부분은 pygame 라이브러리를 사용하시면 좋습니다. 

간혹 코덱설정이 어려우신분들이나 소리를 재생했는데 이상하게 들리는 경우가있는데

그경우는 오디오 음원과 pygame의 코덱설정이 안맞아서 소리가 늘어지는 경우입니다. 

pygame.mixer.init(48000,-16,1,1024) #init mixer (samplerate,bit,channel,buffersize)
pygame.mixer.music.load(music_file) # load music file

위와같이 48kHz, 16bit , 1채널(모노) , 1024(버퍼사이즈) 로 설정한후 ,

music_file 은 파일경로가 오고 그 파일 역시 위와같은 오디오 코덱이여야 문제없이 재생됩니다.

아 경로 설정 어케해요 ㅠㅠ 하시면 

music_file = "sound/inform_voice_.mp3"

이렇게 선언해주시면 됩니다. sound 는 폴더이름입니다.

 

pygame.mixer.music.play()

는 지정된 음악파일을 재생해주는 코드, 

pygame.mixer.music.stop()

스탑은 음악파일을 멈춰주는 코드입니다. 

또한

if not pygame.mixer.music.get_busy() and music_count > MUSIC_START :
 
 
pygame.mixer.music.play()

위와같이 get_busy 라는 함수는 노래가 재생중일때 , 그리고 어느정도 얼굴이 인식된후 소리를 재생하고 싶기때문에 

music_count 변수를 넣엇습니다.

이를 사용하면 얼굴이 인식되지않을때 소리를 멈추고, 인식되고 한 3프레임이상 캡처되면 소리를 재생 할 수 있습니다.

 

5. 사람이 인식되지않으면 제자리로, 소리 중지.

간단하게 소리중지는 위에 pygame을 이용하면 되고, 인식되지 않으면 제자리는 살짝의 기믹이 필요합니다.

 

바로 제자리로 돌아오게 만들면, 무거운 물체를 잡고있는 서보모터나, 그외 다른 체결들이 불안정 해질 수 있기 때문이죠.

 

그래서 이런식으로 처리를 했습니다.

if noface_count > NOFACE_MAX :
 
print('no face during 3s. stop music')
 
dg_y -= ((dg_y-90)/16)
dg_x -= ((dg_x-90)/16)
 

위와같은 구문을 넣어주면, 

dg_y = dg_y - ((dg_y-90)/16) 가 되는 뜻이지요.

즉, 서서히 감소한다는 말입니다. 얼굴이 어느정도 감지되지않는 조건변수인 noface_count를 설정해두면 됩니다. 

 

 

 

 

전체적인 코드 구문은 마지막으로 완성이 되면 정리해서 올리겠습니다.

제 게시글이 조금더 도움이 되셨으면좋겟습니다.

 

감사합니다.

댓글