RSID와 OpenCV 활용 출입감지시스템
RealSenseID 활용 출입관리시스템
우연찮게 RealSenseID(이하 RSID)를 접할 기회가 있어 이를 활용한 출입관리시스템을 만들어 보았다.
코딩이라고는 파이썬 조금밖에 모르는 코린이인지라, 코드가 몹시 비효율적일 수 있으니 단순히 작동방식에 대한 참고용도로만 사용하시길 바란다.
준비물
- 젯슨나노
- Intel RealSenseID
- 리눅스 개발환경
- RSID SDK
- Open CV(선택사항)
- 약간의 파이썬 지식
STEP1. 기본 환경 구축
- RSID 펌업 및 연결
아래 글을 참고하여 펌업과 연결을 진행한다.
# 인텔 RealsenseID F455/F450 첫걸음 - RSID 샘플 코드 분석
RealSenseID/Samples/python 폴더의 예제코드를 참조
STEP2. 얼굴 탐지 코드 작성
해당 코드는 얼굴 탐지(OpenCV)->사용자 인증(RSID)->문 개방(PWM)의 구조로 이루어져 있기에, 첫번째 단계는 OpenCV를 활용하여 얼굴이 있는지 감지하여야 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
import numpy as np
import cv2
xml = 'haarcascade_frontface.xml'
face_cascade = cv2.CascadeClassifier(xml) #사전학습데이터 불러오기
cap = cv2.VideoCapture(-1) #카메라 번호(바뀔 수 있음)
ret, frame = cap.read()
cap.set(3,640)
cap.set(4,480)
facelen = 0
facedelay = 0
while(True):
ret, frame = cap.read() #카메라에서 프레임 읽어오기
frame = cv2.flip(frame, 1) #카메라에서 읽어온 프레임 좌우반전
frame = cv2.rotate(frame, cv2.ROTATE_90_CLOCKWISE) #카메라에서 읽어온 프레임 회전해서 표시
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) #cvt color 함수로 gray로 추출
faces = face_cascade.detectMultiScale(gray, 1.05, 5) #학습데이터 기반 얼굴 검출(프레임, 스케일팩터, 선두께 지정)
facelen = str(len(faces))
facelenint=int(facelen)
print("Number of faces detected: " + facelen)
if len(faces):
for (x,y,w,h) in faces:
cv2.rectangle(frame,(x,y),(x+w,y+h),(255,0,0), 5)
cv2.imshow('FACEID', frame)#카메라 영상 프레임으로 새창 열어 표시
if facelenint != 0:
facedelay += 1
print('delay')
print(facedelay)
else:
facedelay = 0
if facedelay == 10:
exec(open("RSID_Authenticate.py").read())
facedelay = 0
k = cv2.waitKey(30) & 0xff
if k == 27: # Esc 키를 누르면 종료
break
cap.release()
cv2.destroyAllWindows()
STEP3. 사용자 식별
OpenCV를 통해 얼굴의 존재를 확인한 후, 신원확인을 요하는 얼굴이 있을 경우, RSID를 통해 식별한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
"""
License: Apache 2.0. See LICENSE file in root directory.
Copyright(c) 2020-2021 Intel Corporation. All Rights Reserved.
"""
import rsid_py
import time
import Jetson.GPIO as GPIO
SERVO_PIN = 33
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(SERVO_PIN, GPIO.OUT)
pwm = GPIO.PWM(SERVO_PIN, 50)
pwm.start((1./18.)*90+2)
PORT='/dev/ttyACM0'
def on_result(result, user_id):
print('on_result', result)
if result == rsid_py.AuthenticateStatus.Success:
print('Authenticated user:', user_id)
exec(open("RSID_Unlock.py").read())
print('unlocked')
def on_faces(faces, timestamp):
print(f'detected {len(faces)} face(s)')
for f in faces:
print(f'\tface {f.x},{f.y} {f.w}x{f.h}')
if __name__ == '__main__':
with rsid_py.FaceAuthenticator(PORT) as f:
f.authenticate(on_faces=on_faces, on_result=on_result)
STEP4. 문 개폐
젯슨 GPIO 핀을 통해 서보모터로 PWM 신호를 주어 문을 개폐한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import Jetson.GPIO as GPIO
import time
SERVO_PIN = 33
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(SERVO_PIN, GPIO.OUT)
pwm = GPIO.PWM(SERVO_PIN, 50)
pwm.start((1./18.)*90+2)
for i in range(0, 20):
pwm.ChangeDutyCycle((1./18.)*100+2)
time.sleep(0.02)
pwm.ChangeDutyCycle(3.0)
time.sleep(1.0)
pwm.ChangeDutyCycle(0.0)
pwm.stop()
GPIO.cleanup()
This post is licensed under CC BY 4.0 by the author.