create account

6-9 PiCamera 와 OpenCV로 찾은 고양이(Catface) 마리수만큼 LED를 ON OFF 해보자! by codingart

View this thread on: hive.blogpeakd.comecency.com
· @codingart · (edited)
$15.12
6-9 PiCamera 와 OpenCV로 찾은 고양이(Catface) 마리수만큼 LED를 ON OFF 해보자!
![noname04.png](https://cdn.steemitimages.com/DQmZ4KFjsnLSGLeQpafuANqfE6mK7dEPGuyDwGVQrVwLGSq/noname04.png)

앞으로도 출현하게 될 머신 러닝 재품은 단지 컴퓨터 속에서만 활동하는 유령같은 존재가 아니라 자신의 학습 결과를 외부로 표출시켜야 할 필요가 있다. 자율주행 자동차만 해도 주변 환경에 대한 학습 즉시 제어 신호를 생성 하여 인터페이스 되어 있는 자동차 주행 장치를 능숙하게 제어해야 할 필요가 있다.

마찬가지로 실제로 어슬렁 거리는 고양이들을 영상 frame 으로 캡츄어 하여  haarcascade_frontalcatface.xml을 사용하여 고양이 머릿 수를 파악했으면 적어도 연동된 스위치를 ON하여 사료를 주거나 목소리를 들려주든지 하는 액션이 필요할지도 모르겠다. 
따라서 여기서는 파악된 고양이 머릿 수를 단지 모니터에 디스플레이만 할 것이 아니라 사용자에 대한 정보 전달 방안으로 몇 마리인지 GPIO 인터페이스된 LED ON OFF를 통해 마리 수만큼 점멸 시켜 보기로 한다.

단순히 LED를 일정 시간 간격으로 ON OFF 시키는 작업은 마이크로콘트롤러인 아두이노 우노 보드를  사용하면 간단한 배선 작업과 함께 짧은 C 코드를 사용하여 가능할 것이다.

![noname01.png](https://cdn.steemitimages.com/DQmWu1Gm3JFE2shtYQXd8wDt5QMj37QkqxsBx5zgcQZVKs4/noname01.png)

아두이노 보드를 사용하여 ON OFF 하는 LED를  직접 눈으로 본다든지 또는 DHT11 이나 DHT22 온습도 센서를 사용하여 온도를 읽어 내는 초보적인 묘기와 같은 IOT 사물인터넷 코딩은 이미 4월부터 스팀잇에 필자가 최근의 “아두이노 코딩-129: 앱인벤터와 아두이노 HC-06 블루투스에 의한 DHT11 온습도 모니터링”에 이르기까지 많은 사례들을 소개하였고 그 내용들을 모조리 모아서 이미 교보문고에 작업 일지 형태의 참고용 책으로 출판까지도 하였다.

![noname02.png](https://cdn.steemitimages.com/DQmeiUryzNpZcMv9KgNrckK9yxpSwGZEfHd8Tr3HGkQ8sKQ/noname02.png)

그 정도 충분한 경험을 가지고 있으면서도 막상 라즈베리 파이 B/B+ 컴퓨터를 사용하여 OpenCV 고양이 찾기 코드를 실행하면서 동시에 아두이노 우노와 같은 마이크로 콘트롤러처럼 라즈베리 파이를 유사 마이크로콘트롤러 처럼 사용함에는 뭔가 코딩 상의 어려움이 있을 것이라고 오랫동안 주저했던 것이 사실이지만 드디어 시도해봐야 할 시기가 되었다고 본다.

#라즈베리 파이 T bar 연결 LED 배선
라즈베리 파이3 B/B+보드 측면에 제공되는 40개의 인터페이스용 핀들을 사용하여 LED ON OFF를 위한 배선 작업이 필요하다. 


하지만 현재 Pi 카메라를 설치한 상태이므로 직접 40개의 인터페이스 핀 들을 대상으로 점퍼선을 직접 설치하기가 용이하지 않으므로 아예 40핀 커넥터와 연결된 리본 케이블에 의해 빵판까지 T bar를 설치하여 배선하기로 하였다.

LED 배선 원리는 아두이노 보드에서의 원리와 같다고 보면 된다, 공급 전원의 전압도 5V 이며 단지 라즈베리 파이 B/B+보드에는 제공하는 핀수가 총 40개로서 전압 공급 핀과 Ground 핀을 제외한 디지털 데이터 핀만 26개에 달한다. 커버 사진에서 보듯이 그 중에 BCM 넘버링 기준으로 16번 핀에 청색 LED 양극을 연결하였다. 아울러 직렬 연결된 220Ω 전류제한 저항과의 연결은 LED에 20mA 이상 흐르지 않도록 퓨즈처럼 보호 역할을 하며 실제 측정해 보면 10mA 이상 흐르지 않는다.

#RPi.GPIO 라이브러리 모듈 설치 
라즈베리 파이 보드의 인터페이스 핀에 배선된 LED를 동작시키려면 인터페이스 핀 즉 GPIO 핀을 동작 시킬 수 있도록 지원하는 RPi.GPIO 라이브러리 모듈을 설치해야 한다.
이 모듈은 SD카드에 OS 가 설치됨과 동시에 제공됨에 유의하자. 따라서 업데이트와 업그레이드 말고는 별도로 설치 작업을 하지 않아도 되는 것으로 필자도 알고 있었다.

그럼에도 불구하고 예기치 않게 컴파일 업로딩 시 No module imported  에러가 발생하였다. 서당개 생활 3년이면 풍월을 읊을 수준인데 그래도 필자가 아두이노 빼고도 라즈베리 파이만 해도 거의 1년 반이 넘어가는 경력인데 처음 입문한 초보들이 겪는 황당한 에러 메시지가 떴다. 문제를 해결하기 위해서 여러번 안되는 줄 알면서 RPi.GPIO 라이브러리 설치를 반복했다. 주특기인 좌충우돌도 다 소용이 없었다. 세상이 무너지는 느낌까지는 아니라지만 한심스러울 정도로 황당하게 느꼈다.

그래서 어쩔 수 없이 다음의 인터넷 주소를 참고로 하여 사이트를 열어 놓고 명령을 복사해다 붙이는 방식으로 재설치 작업을 실행하였다.
https://www.raspberrypi-spy.co.uk/2012/05/install-rpi-gpio-python-library/

![noname05.png](https://cdn.steemitimages.com/DQmQ97X7VWQDrj3BxsZANvt7jsewKfiXYrs657sa7dpQkp8/noname05.png)

이 설치법이라고 해서 특별한 내용이 있는 것은 아니었다. 손 놓고 있을 수만은 없기에 그냥 해본 것이다. 취미 생활이랍시고 아두이노 라즈베리 코딩 판 벌리면서 이런 짓거리 수도 없이 했다는 생각이 들었다. 그러고도 어떻게 해서든 몇 달 또는 1년 정도 기간 안에 소 뒷발에 쥐잡기로 해결이 되면 개구리 올챙이 시절 싹 잊어 버리듯이 본연의 취미 생활로 돌아간게 벌써 몇번인지 기억도 잘 나지 않는다.

# LED ON OFF  코드 테스트 
일단 설치가 끝난 후 반드시 rebooting 하고 LED ON OFF를 위한 다음과 같이 간단한 테스트용 파이선코드를 입력하여 IDLE3에서 실행하도록 하자. 

#led-01.py
import ROi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(16, GPIO.OUT)
for i in range(0,10):
    GPIO.output(16, GPIO.HIGH)
    time.sleep(0.5)
    GPIO.output(16, GPIO.LOW)	
    time.sleep(0.5)
GPIO.cleanup

GPIO.BCM setmode는 BCM 방식의 핀 넘버링을 설정한다는 듯이다. T bar에 인쇄된 핀 번호가 바로 BCM 번호이다. setwarnings(False)를 해두지 않으면 메번 파이선 셸에 시뻘겋게 뵈기 싫은 경고 메시지가 뜨므로 필히 넣어두도록 한다. setup(16, GPIO.OUT) 은 아두이노의 pinMode(16, OUTPU)에 해당한다고 보면 된다. 이하 for looping에서 10회 ON OFF를 시킨다. time.sleep(0.5)는 아두이노의 delay(500)에 해당한다. 마지막으로 GPIO.cleanup 이 있는데 이 명령을 실행하지 않으면 때로는 LED 가 꺼지지 아노은 상태 그대로 라즈베리 파이 컴퓨터 모드로 돌아가 버린다. 마이크로 콘트롤러인 아두이노에서 전원을 제거하면 LED 가 다 OFF 되어 바란다. 하지만 라즈베리 파이는 전원만 주면 계속 looping을 도는 마이크로콘트롤러가 아니기 때문에 GPIO를 작동시키는 마이크로콘트롤러 상태를 OFF 하려면 이 마지막 명령이 반드시 필요하다.

그런데 막상 IDLE3에서 명령을 실행하니  다시 RuntimeError: No access to /dev/mem. Try running as root! 에러 메세지가 발생하였다. 

![noname06.png](https://cdn.steemitimages.com/DQmNTjYYQ9HYvBTBLtiXV8urHwhEoMwyJAMFADsTXWZxAyn/noname06.png)

분명히 제대로 설치가 된듯한데 왜 이런 에러가 발생하는지 생각해볼 틈도 없이 터미널 창을 연 후 실행코드가 들어 있는 폴더로 변경해서 command line  방식으로 실행을 시켰다. 즉 as root 로 해보라는 뜻은 해당 코드가 들어 있는 폴더로 옮겨가서 sudo python3 파이선 실행 코드명 으로 실행시키라는 뜻이다. 대단히 불편하기 짝이 없다. 하지만 그렇게 하면 되므로 IDLE3에서 직접 RUN하는 방법은 나중에 강구하기로 하겠다.

이 문제가 발생하는 이유는 OpenCv 설치 시에 가상환경이란 걸 설정해서 그 안에서 Numpy를 비롯한 라이브러리를 설치하면서 Python3번전과 Numpy 와 OpenCV가 한묶음 처리가 되어 RPi.GPIO 라이브러리 모듈이 설치되어 있음에도 불구하고 그밖에 것 정도로 취급하는 듯하다. 그렇 줄 알았으면 Numpy 설치할 때에 함께 설치할 것을... 후회해 보야 이미 OpenCV 는 설치되어 버렸으니 먼 훗날 시도해 보기로 하고 지금은 터미널 창에서 command line 명령으로 버텨보기로 한다.

![noname07.png](https://cdn.steemitimages.com/DQmTxPSi9Yk3RkUVaP2PDfYsXfLs9pueqa9tZyCZYJzjy4X/noname07.png)


일단 터미널 창에서 LED 점멸이 되는지  짤로 확인해보자.
https://youtu.be/OlDUNWnJiYE

# 고양이 찾기 코드와 LED ON OFF 연동 테스트 

코드가 실행되어 Pi 카메라나 이미지 파일로부터 다수의 오브젝트를 발견하게 되면 발견한 오브젝트의 수만큼 딱 한번 LED 점멸을 시켜 보자는 의도이다. 물론 오브젝트의 수가 변동된다면 LED 보다는 lcd 디스플레이나 7segment 에 의해 직접 숫자를 표기하는 것이 나을 것이다. 곧 별도로 그런 시스템을 인터페이스 해 볼 계획이디.

하지만 지금의 주요 관점은 고양이 찾기 코드에 GPIO 제어에 의한 LED ON OFF 코드가 순조롭게 연동되느냐는 문제이다. 현재의 코드는 실시간으로 Pi 카메라가 촬영하는 frame 수가 32인 영상을 대상으로 코딩이 되어 있기 때문에 아두이노아 마찬가지로 계속 for looping을 돌게 되어 있다.

지금은 고양이들이 들어있는 정적인 사진 파일을 이용하는 단계이므로 코드 시작하자마자 처음에 오브젝트 수가 파악되었을 때 한번만 ON OFF를 되풀이 해 주면 되므로 코드 초반에 cnt 변수를 1로 두고 코드 후반에 if 제어문에서 cnt == 1 일 때 한번만 ON OFF 점멸을 하도록 코딩하였다. 아울러 frame 이미지를 스크린에 출력 후 cnt를 1만큼 증가시킨다.

마지막에 코드를 빠져 나오기 전에 GPIO.cleanup을 실시하여 LED를 OFF 상태로 만든다.
그렇치 않으면 코드 실행이 완료된 후에도 ON 상태로 남아 있을 수도 있다.
다음의 코드 내용 중에 박스 친 부분이 고양이 찾기 코드에 LED ON OFF를 위해 추가되는 부분이다.

![noname08.png](https://cdn.steemitimages.com/DQmWNkjCpFZZutMjrSoYyae9gKob2XU9GwxDuDniTgRuzqb/noname08.png)

첨부된 짤에서 시작과 더불어 3번 오브젝트 수 만큼 LED 가 점멸하는 것을 확인하고 체크된 고양이 화면이 라즈베리 파이의 실행 속도 문제로 인해 조금 늦게 뜨는 것을 관찰해 보자.
https://youtu.be/f5dSmL-lZtA

파이선 실행 코드 catface_led.py 파일을 필자의 블로그 사이트에 첨부해 두었으니 다운받아 활용하기 바란다.
http://blog.daum.net/ejleep1/32
👍  , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , and 47 others
properties (23)
authorcodingart
permlink6-9-picamera-opencv-catface-led-on-off
categorykr
json_metadata{"tags":["kr","kr-newbie","manamine","jjangjjangman","kr-dev"],"image":["https://cdn.steemitimages.com/DQmZ4KFjsnLSGLeQpafuANqfE6mK7dEPGuyDwGVQrVwLGSq/noname04.png","https://cdn.steemitimages.com/DQmWu1Gm3JFE2shtYQXd8wDt5QMj37QkqxsBx5zgcQZVKs4/noname01.png","https://cdn.steemitimages.com/DQmeiUryzNpZcMv9KgNrckK9yxpSwGZEfHd8Tr3HGkQ8sKQ/noname02.png","https://cdn.steemitimages.com/DQmQ97X7VWQDrj3BxsZANvt7jsewKfiXYrs657sa7dpQkp8/noname05.png","https://cdn.steemitimages.com/DQmNTjYYQ9HYvBTBLtiXV8urHwhEoMwyJAMFADsTXWZxAyn/noname06.png","https://cdn.steemitimages.com/DQmTxPSi9Yk3RkUVaP2PDfYsXfLs9pueqa9tZyCZYJzjy4X/noname07.png","https://img.youtube.com/vi/OlDUNWnJiYE/0.jpg","https://cdn.steemitimages.com/DQmWNkjCpFZZutMjrSoYyae9gKob2XU9GwxDuDniTgRuzqb/noname08.png","https://img.youtube.com/vi/f5dSmL-lZtA/0.jpg"],"links":["https://www.raspberrypi-spy.co.uk/2012/05/install-rpi-gpio-python-library/","https://youtu.be/OlDUNWnJiYE","https://youtu.be/f5dSmL-lZtA","http://blog.daum.net/ejleep1/32"],"app":"steemit/0.1","format":"markdown"}
created2018-10-05 00:34:42
last_update2018-10-05 03:14:39
depth0
children3
last_payout2018-10-12 00:34:42
cashout_time1969-12-31 23:59:59
total_payout_value11.427 HBD
curator_payout_value3.693 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length5,754
author_reputation41,833,111,979,966
root_title"6-9 PiCamera 와 OpenCV로 찾은 고양이(Catface) 마리수만큼 LED를 ON OFF 해보자!"
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id72,645,585
net_rshares8,922,779,998,208
author_curate_reward""
vote details (111)
@urobotics · (edited)
선생님 도서[캡스톤 디자인을 위한 아두이노 프로세싱] 도서관에 신청했었는데요. 완판돼서 못 들어왔다고 합니다. ㅎㅎㅎ 잘 나가시는듯 ㅋㅋㅋ
properties (22)
authorurobotics
permlinkre-codingart-6-9-picamera-opencv-catface-led-on-off-20181005t004115353z
categorykr
json_metadata{"tags":["kr"],"app":"steemit/0.1"}
created2018-10-05 00:41:15
last_update2018-10-05 00:41:39
depth1
children2
last_payout2018-10-12 00:41:15
cashout_time1969-12-31 23:59:59
total_payout_value0.000 HBD
curator_payout_value0.000 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length77
author_reputation14,923,860,622,500
root_title"6-9 PiCamera 와 OpenCV로 찾은 고양이(Catface) 마리수만큼 LED를 ON OFF 해보자!"
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id72,645,870
net_rshares0
@codingart ·
감사합니다. 사실은 PDF 파일에서 몇줄이 밀려 파일 교체 신청을 했고 교보에서 승인받는데 일주정도 필요하다고 지난 주에 연락 받았습니다.
properties (22)
authorcodingart
permlinkre-urobotics-re-codingart-6-9-picamera-opencv-catface-led-on-off-20181005t004402264z
categorykr
json_metadata{"tags":["kr"],"app":"steemit/0.1"}
created2018-10-05 00:43:57
last_update2018-10-05 00:43:57
depth2
children1
last_payout2018-10-12 00:43:57
cashout_time1969-12-31 23:59:59
total_payout_value0.000 HBD
curator_payout_value0.000 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length77
author_reputation41,833,111,979,966
root_title"6-9 PiCamera 와 OpenCV로 찾은 고양이(Catface) 마리수만큼 LED를 ON OFF 해보자!"
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id72,645,973
net_rshares0
@urobotics ·
아하. ㅇ_ㅇ 아직 미판매라서 그렇게 됐군요. 헐. 전 완판된줄 ㅋㅋㅋ 다시 신청해야겠어요. 
(저도 그런 적 있는데 ㅎㅎㅎㅎ 직접 하는 거 처음에는 정말 힘들더라구요. ㅎㅎ 화이팅입니다.)
properties (22)
authorurobotics
permlinkre-codingart-re-urobotics-re-codingart-6-9-picamera-opencv-catface-led-on-off-20181005t012442640z
categorykr
json_metadata{"tags":["kr"],"app":"steemit/0.1"}
created2018-10-05 01:24:42
last_update2018-10-05 01:24:42
depth3
children0
last_payout2018-10-12 01:24:42
cashout_time1969-12-31 23:59:59
total_payout_value0.000 HBD
curator_payout_value0.000 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length106
author_reputation14,923,860,622,500
root_title"6-9 PiCamera 와 OpenCV로 찾은 고양이(Catface) 마리수만큼 LED를 ON OFF 해보자!"
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id72,647,798
net_rshares0