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) 얼굴인식 인원수 출력
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)
ids = [item['id'] for item in bboxs]
# print(ids)
print('얼굴 인식 인원수 :', len(ids))
cv2.imshow("Image", img)
# cv2.waitKey(1)
key = cv2.waitKey(10)
if key == 27: # esc key
break
cap.release()
cv2.destroyAllWindows()
3) 얼굴인식으로 아두이노 LED 제어하기
- 얼굴이 인식되면 아두이노에 13번 LED가 켜지도록 제어해보겠습니다.
- 아두이노에 13번 LED를 제어하는 소스코드를 먼저 업로드합니다.
- 아두이노 소스코드
- openCV관련 파이썬 라이브러리 다운로드 : cvzone.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가 꺼진다.
4) 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()
- 결과
- 이런 식으로 얼굴인식이 되면 데이터를 아두이노로 전송하여 서보모터나 스피커 등을 제어할 수 있으니 다양한 프로젝트를 진행해 보시기 바랍니다.
5) 서보모터 제어하기
- 아두이노 소스(서보모터를 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도로 돌아오게 됩니다.
'피지컬컴퓨팅 > 아두이노' 카테고리의 다른 글
DS1302 RTC(Real Time Clock) (0) | 2024.04.05 |
---|---|
조이스틱 활용하기(LED 제어하기) (0) | 2024.03.29 |
RFID 모듈 활용하기(도어락 만들기) (0) | 2024.03.26 |
8x8 도트 매트릭스( MAX7219 ) 활용하기 (0) | 2024.03.26 |
FND 4 digit 7 segment 활용하기 (0) | 2024.03.26 |