Post

RSID와 OpenCV 활용 출입감지시스템

RSID와 OpenCV 활용 출입감지시스템

RealSenseID 활용 출입관리시스템

우연찮게 RealSenseID(이하 RSID)를 접할 기회가 있어 이를 활용한 출입관리시스템을 만들어 보았다.
코딩이라고는 파이썬 조금밖에 모르는 코린이인지라, 코드가 몹시 비효율적일 수 있으니 단순히 작동방식에 대한 참고용도로만 사용하시길 바란다.

준비물

  • 젯슨나노
  • Intel RealSenseID
  • 리눅스 개발환경
  • RSID SDK
  • Open CV(선택사항)
  • 약간의 파이썬 지식

STEP1. 기본 환경 구축

  1. RSID 펌업 및 연결
    아래 글을 참고하여 펌업과 연결을 진행한다.
    # 인텔 RealsenseID F455/F450 첫걸음
  2. 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.