본문 바로가기

메이킹/아두이노

openCV를 활용하여 아두이노 제어하기(얼굴인식 도어락)

반응형

openCV는 오픈소스 컴퓨터비전 라이브러리 중 하나로 크로스플랫폼과 실시간 이미지 프로세싱에 중점을 두고 있습니다. Windows, Linux, macOS, IOS, Android 등 다양한 플랫폼을 지원합니다. 영상처리를 대중화시킨 1등 공신으로 사실상 영상 관련 라이브러리로서 표준의 지위를 가지고 있어 openCV로 웬만한 영상 처리는 가능하다고 할 수 있습니다.

여기서 자세한 원리는 다루지 않지만 시간을 두고 공부해 볼 것을 권장합니다.

 

1) 얼굴인식

- Visual Studio Code 를 실행하고 File->Open Folder메뉴를 선택합니다.

바탕화면에 작업폴더 'Arduino_Face' 만들고 새로운 파일 'FaceDetect.py' 를 만들어 아래의 소스코드를 넣고 실행시킵니다.

import cv2
from cvzone.FaceDetectionModule import FaceDetector
cap = cv2.VideoCapture(0) # 노트북 카메라는 0번, 별도의 웹캠인 경우 1번

detector = FaceDetector()

while True:
    success, img = cap.read()
    img, bboxs = detector.findFaces(img)
    cv2.imshow("Image", img)
    # cv2.waitKey(1)

    key = cv2.waitKey(10)

    if key == 27:  # esc key
        break

cap.release()
cv2.destroyAllWindows()

 

- 결과 : openCV 라이브러리를 이용하여 얼굴이 인식되며 정확도가 함께 출력됩니다.

 

 

2) 얼굴인식으로 아두이노 LED 제어하기

- 얼굴이 인식되면 아두이노에 13번 LED가 켜지도록 제어해보겠습니다.

- 아두이노에 13번 LED를 제어하는 소스코드를 먼저 업로드합니다.

 

- 아두이노 소스코드

- openCV관련 파이썬 라이브러리 다운로드

zip 라이브러리 설치하기

 

 

#include <cvzone.h>

SerialData serialData(1,1); //(numOfValsRec,digitsPerValRec)

int valsRec[1];

void setup() {
  serialData.begin(); 
  pinMode(13,OUTPUT);
}

void loop() {
  serialData.Get(valsRec);
  digitalWrite(13,valsRec[0]);

}

 

- VScode에서 'FaceDetectLed.py' 로 파이썬 파일을 만들어 아래의 소스코드를 넣어 실행시킵니다.

- 이 때 아두이노의 포트번호를 확인하고 수정해 주어야 합니다.

import cv2
from cvzone.FaceDetectionModule import FaceDetector
from cvzone.SerialModule import SerialObject

cap = cv2.VideoCapture(0)
detector = FaceDetector()
arduino = SerialObject('COM5') # 아두이노 포트를 찾아 수정

while True:
    success, img = cap.read()
    img, bboxs = detector.findFaces(img)

    if bboxs:
        arduino.sendData([1]) # 얼굴을 인식하면 '1'을 보냄
    else:
        arduino.sendData([0]) # 인식 못하면 '0'을 보냄

    cv2.imshow("Image", img)
    # cv2.waitKey(1)

    key = cv2.waitKey(10)

    if key == 27:  # esc key
        break

cap.release()
cv2.destroyAllWindows()

 

- 결과

-얼굴이 인식되면 13번 LED가 켜지고 얼굴인식이 안되면 LED가 꺼진다.

 

3) RGB LED 제어하기

- 얼굴이 인식되면 아두이노에 연결된 RGB LED를 제어해보겠습니다.

- 아두이노에 삼색 LED를 제어하는 소스코드를 먼저 업로드합니다.

#include <cvzone.h>

SerialData serialData(3,1);
int valsRec[3];

int red = 9;
int blue = 10;
int green = 11;

void setup() {
  serialData.begin();
  pinMode(red, OUTPUT);
  pinMode(blue, OUTPUT);
  pinMode(green, OUTPUT);
}

void loop() {
  serialData.Get(valsRec);
  digitalWrite(red, valsRec[0]);
  digitalWrite(green, valsRec[1]);
  digitalWrite(blue,valsRec[2]);

}

 

-  'FaceDetectRGBLed.py' 로 파이썬 파일을 만들어 아래의 소스코드를 넣어 실행시킵니다.

import cv2
from cvzone.FaceDetectionModule import FaceDetector
from cvzone.SerialModule import SerialObject

cap = cv2.VideoCapture(0)
detector = FaceDetector()
arduino = SerialObject('COM5')

while True:
    success, img = cap.read()
    img, bboxs = detector.findFaces(img)

    if bboxs:
        # (R,G,B)  "0" is on "1" is off
        arduino.sendData([1, 0, 0])
    else:
        arduino.sendData([0, 0, 1])

    cv2.imshow("Image", img)

    key = cv2.waitKey(10)

    if key == 27:  # esc key
        break

cap.release()
cv2.destroyAllWindows()

 

 

- 결과

얼굴인식이 되면 RGB LED 의 RED가 켜짐

 

- 이런 식으로 얼굴인식이 되면 데이터를 아두이노로 전송하여 서보모터나 스피커 등을 제어할 수 있으니 다양한 프로젝트를 진행해 보시기 바랍니다.

 

4)  서보모터 제어하기

- 아두이노 소스(서보모터를 3번 핀에 연결함)

#include <cvzone.h>
#include <Servo.h>

SerialData serialData(1,1); //(numOfValsRec,digitsPerValRec)
Servo myservo;
int ServoPin=3;

int valsRec[1];

void setup() {
  serialData.begin(); 
  myservo.attach(ServoPin);
}

void loop() {
  serialData.Get(valsRec);
  if(valsRec[0]==1){
    myservo.write(90);
  }
  else{
    myservo.write(0);
  }
}

 

 

- 파이썬 소스

import cv2
from cvzone.FaceDetectionModule import FaceDetector
from cvzone.SerialModule import SerialObject

cap = cv2.VideoCapture(0)
detector = FaceDetector()
arduino = SerialObject('COM8') # 아두이노 포트를 찾아 수정

while True:
    success, img = cap.read()
    img, bboxs = detector.findFaces(img)

    if bboxs:
        arduino.sendData([1]) # 얼굴을 인식하면 '1'을 보냄
    else:
        arduino.sendData([0]) # 인식 못하면 '0'을 보냄

    cv2.imshow("Image", img)
    # cv2.waitKey(1)

    key = cv2.waitKey(10)

    if key == 27:  # esc key
        break

cap.release()
cv2.destroyAllWindows()

 

- 결과 : 얼굴을 인식하면 서보모터가 90도 돌아가고 인식못하면 0도로 돌아오게 됩니다.

반응형