산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

Arduino를 사용한 얼굴 추적

구성품 및 소모품

Arduino UNO
× 1
웹 캠
× 1
마이크로 서보
× 2
팬-틸트
× 1
브레드보드(일반)
× 1

앱 및 온라인 서비스

파이썬 2.7
OpenCV

이 프로젝트 정보

이전 튜토리얼에서 'pyserial' 모듈을 사용하여 Arduino와 Python 간에 통신하고 LED를 제어하는 ​​방법을 공유했습니다. 아직 보지 못했다면 여기에서 확인하세요:COMMUNICATION BETWEEN ARDUINO &PYTHON!

물체의 색상을 감지하고 화면에서 추적하는 방법은 여기에서 확인하십시오:OPENCV 및 PYTHON을 사용한 색상 감지

이 튜토리얼에서는 Arduino와 Python을 사용하여 얼굴을 추적하고 카메라가 얼굴을 따르도록 하는 방법을 보여줍니다. 어렵게 들릴 수 있지만 그렇지 않습니다. Arduino와 Python에 대한 기본 지식만 있으면 됩니다.

그럼 시작하겠습니다...

1단계:필요한 것

요구 사항은 최소입니다. 여기에 필요한 모든 것의 일부 목록을 제공했습니다.

하드웨어 요구사항:

<울>
  • Arduino UNO(다른 보드 사용 가능)
  • 웹 캠(미니 웹 캠)
  • 서보 x 2(저는 마이크로 서보를 사용하지만 표준 서보를 사용할 수 있음)
  • 브레드보드(프로토타이핑용)
  • 서보 팬 틸트 키트(원하는 경우 제작 가능)
  • 소프트웨어 요구사항:

    <울>
  • Python 2.7(설치해야 함, Linux OS에는 일반적으로 사전 설치되어 있음)
  • OpenCV(별도 다운로드 또는 'pip install'을 사용하여 설치할 수 있음)
  • pyserial(pip로 설치 가능)
  • 겁나.
  • 하르캐스케이드.
  • 모든 것이 수집되면 설치 단계로 이동할 수 있습니다...

    2단계:Python 환경 설정

    Python 설치:

    따라서 먼저 Python 2.7을 실행해야 합니다. 이를 수행하려면 먼저 python 2.7.14를 다운로드하고 설치하십시오. 제대로 설치되었는지 확인하려면 Goto:Windows 검색>> "IDLE" 입력>> Enter 키를 누릅니다. Python 셸이 나타납니다.

    또는

    검색에 'CMD'를 입력하고 Enter 키를 눌러 명령 프롬프트를 엽니다. CMD에서 >> python을 입력하고 Enter 키를 누릅니다. Python 인터페이스가 표시되어야 합니다.

    CMD에서 오류가 표시되면 당황하지 마십시오. 아마도 환경 변수를 설정해야 할 것입니다. 이 튜토리얼은여기에서 따를 수 있습니다. 환경 변수를 설정합니다.

    Python에서 'pyserial', 'OpenCV' 및 "numpy" 설치:

    이 모듈을 설치하려면 pip install을 사용합니다.

    먼저 CMD를 열고 다음 코드를 입력하십시오.-

    >pip install serial
    >pip install opencv-python
    >pip install numpy

    이 명령은 필요한 모듈을 설치합니다. 이제 코딩 부분으로 이동할 수 있습니다...

    3단계:Python 스크립트

    코드 작성을 시작하기 전에 모든 코드를 동일한 폴더에 저장해야 하므로 먼저 새 폴더를 만들어야 합니다. 따라서 새 폴더를 만들고 이름을 원하는 대로 지정합니다. 아래에서 'Haarcascade'를 다운로드하여 폴더에 붙여넣습니다.

    이제 메모장을 열고 아래 스크립트를 작성하고 haarcascade와 같은 폴더에 'face.py'로 저장합니다. (아래 파일에서 제공한 코드를 다운로드할 수 있습니다.) :

    #필요한 모든 모듈 가져오기
    numpy를 np로 가져오기
    시리얼 가져오기
    시간 가져오기
    시스템 가져오기
    cv2 가져오기
    #Setup arduino의 통신 경로('COM5' 대신 arduino가 연결된 포트를 입력)
    arduino =serial.Serial('COM5', 9600)
    time.sleep(2)
    print("arduino에 연결되었습니다...")
    #얼굴 감지를 위한 Haarcascade 가져오기
    face_cascade =cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
    #에서 비디오 스트림을 캡처하려면 webcam.
    cap =cv2.VideoCapture(0)
    #캡처된 이미지를 읽고 회색 이미지로 변환하고 얼굴을 찾습니다.
    1:
    ret, img =cap.read ()
    cv2.resizeWindow('img', 500,500)
    cv2.line(img,(500,250),(0,250),(0,255,0),1)
    cv2.line( img,(250,0),(250,500),(0,255,0),1)
    cv2.circle(img, (250, 250), 5, (255, 255, 255), -1)
    회색 =cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    faces =face_cascade.detectMultiScale(gray, 1.3)
    #얼굴을 감지하고 주위에 직사각형을 만듭니다.
    면의 (x,y,w,h)에 대해:
    cv2.rectangle(img,(x,y),(x+w,y+h),( 0,255,0),5)
    roi_gray =회색[y:y+h, x:x+w]
    roi_color =img[y:y+h, x:x+w]
    arr ={y:y+h, x:x+w}
    인쇄(arr)

    인쇄('X:' +str(x))
    인쇄( 'Y :'+str(y))
    print('x+w :' +str(x+w))
    print('y+h :' +str(y+h))
    # 투자 수익의 중심(사각형)
    xx =int(x+(x+h))/2
    yy =int(y+(y+w))/2
    인쇄 (xx)
    print (yy)
    center =(xx,yy)
    # arduino에 데이터 보내기
    print("사각형의 중심은 :", 가운데)
    데이터 ="X{0:d}Y{1:d}Z".format(xx, yy)
    print("출력 ='" +data+ "'")
    arduino.write( data)
    #스트림을 표시합니다.
    cv2.imshow('img',img)
    #실행을 종료하려면 'Esc' 키를 누르십시오.
    k =cv2.waitKey(30) &0xff
    k ==27인 경우:
    중단

    이 작업이 완료되면 Arduino용 코드 작성으로 이동합니다...

    haarcascade_frontalface_default.xml face.py

    4단계:Arduino 코드

    파이썬 스크립트가 준비되면 서보를 제어하기 위해 arduino 스케치가 필요합니다. 아래 코드를 참고하여 아두이노 IDE에 붙여넣고 face.py, haarcascade와 같은 폴더에 'servo.ino'로 저장합니다. 코드를 업로드하고 다음 단계로 이동하여 연결하십시오.

    (다운로드 가능한 파일은 아래와 같습니다.)

    #include
    서보 서보 버전; //수직 서보
    서보 서보Hor; //수평 서보
    int x;
    int y;
    int prevX;
    int prevY;
    void setup()
    {
    직렬 .begin(9600);
    servoVer.attach(5); //수직 서보를 핀 5에 연결
    servoHor.attach(6); //수평 서보를 핀 6에 연결
    servoVer.write(90);
    servoHor.write(90);
    }
    void Pos()
    {
    if(prevX !=x || prevY !=y)
    {
    int 서보X =map(x, 600, 0, 70, 179);
    int 서보Y =map(y , 450, 0, 179, 95);
    서보X =최소(서보X, 179);
    서보X =최대(서보X, 70);
    서보Y =최소(서보Y, 179);
    서보Y =최대(서보Y, 95);

    servoHor.write(servoX);
    servoVer.write(servoY);
    }
    }
    무효 루프()
    {
    if(Serial.available()> 0)
    {
    if(Serial.read() =='X')
    {
    x =Serial.parseInt();
    if(Serial.read() =='Y')
    {
    y =Serial.parseInt();
    Pos();
    }
    }
    while(Serial.available()> 0)
    {
    Serial.read();
    }
    }
    }
    서보.이노

    5단계:팬-틸트 메커니즘:-

    Pan-Tilt에 쉽게 구할 수 있는 키트를 사용했습니다. 원하는 경우 나무/플라스틱 또는 3D 프린트를 사용하여 직접 만들 수 있습니다.

    제가 사용한건 아주 저렴하고 조립도 쉽습니다. 그러나 그 방법에 대한 지침이 필요한 경우 여기에서 찾을 수 있습니다.

    6단계:연결하기

    회로는 매우 간단합니다. arduino에 두 개의 서보를 연결하기만 하면 됩니다.

    <울>
  • 5번 핀에 수직
  • 6번 핀에 수평
  • +5V까지 전력
  • GND에 접지
  • 참고용으로 회로도를 확인하십시오.

    7단계:테스트

    <울>
  • 모든 작업이 완료된 후 마지막으로 해야 할 일은 작동하는지 테스트하는 것입니다. 먼저 테스트하려면 서보가 arduino에 제대로 연결되어 있고 스케치가 업로드되어 있는지 확인하세요.
  • 스케치를 업로드한 후 IDE를 닫아야 포트가 Python에 자유롭게 연결할 수 있습니다.
  • 이제 Python IDLE로 'face.py'를 열고 'F5'를 눌러 코드를 실행합니다. arduino에 연결하는 데 몇 초가 걸리고 웹 캠을 스트리밍하는 창을 볼 수 있습니다. 이제 코드가 얼굴을 감지하고 서보가 얼굴을 추적합니다.
  • 오브젝트를 움직일 때 서보도 움직여야 합니다. 이제 카메라를 서보에 연결하기만 하면 서보와 함께 움직이게 됩니다.
  • 네가 좋아하길 바래. 새로운 것을 배우십시오.

    감사합니다!

    <섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">

    코드

    <울>
  • servo.ino
  • 코드 스니펫 #2
  • 코드 스니펫 #3
  • servo.ino아두이노
    파일을 여는 동안 오류가 발생했습니다.
    코드 스니펫 #2일반 텍스트
    #필요한 모든 모듈을 import numpy as npimport serialimport timeimport sysimport cv2#Setup arduino의 통신 경로('COM5' 대신 arduino가 연결된 포트를 입력) arduino =serial.Serial('COM5', 9600 ) time.sleep(2)print("arduino에 연결됨...")#얼굴 감지를 위한 Haarcascade 가져오기face_cascade =cv2.CascadeClassifier('haarcascade_frontalface_default.xml')#webcam.cap에서 비디오 스트림을 캡처하려면 =cv2.VideoCapture (0)#캡처된 이미지를 읽고 회색 이미지로 변환하고 facewhile 1:ret, img =cap.read() cv2.resizeWindow('img', 500,500) cv2.line(img,(500,250),(0,250) ),(0,255,0),1) cv2.line(img,(250,0),(250,500),(0,255,0),1) cv2.circle(img, (250, 250), 5, (255) , 255, 255), -1) 회색 =cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) faces =face_cascade.detectMultiScale(gray, 1.3)#얼굴을 감지하고 그 주위에 직사각형을 만듭니다. 면의 (x,y,w,h):cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),5) roi_gray =gray[y:y +h, x:x+w] roi_color =img[y:y+h, x:x+w] arr ={y:y+h, x:x+w} print (arr) print ('X :' +str(x)) 인쇄('Y :'+str(y)) 인쇄('x+w:' +str(x+w)) 인쇄('y+h:' +str(y+h)) # 투자수익의 중심(사각형) xx =int(x+(x+h))/2 yy =int(y+(y+w))/2 print(xx) print(yy) center =(xx,yy)# 보내기 arduino에 데이터를 출력합니다. ") arduino.write(data)#스트림을 표시합니다. cv2.imshow('img',img)#실행을 종료하려면 'Esc' 키를 누르세요. k =cv2.waitKey(30) &0xff if k ==27:break
    코드 스니펫 #3일반 텍스트
    #include서보 서보 버전; //수직 ServoServo servoHor; //수평 서보 x;int y;int prevX;int prevY;void setup(){ Serial.begin(9600); 서보 Ver.attach(5); //수직 서보를 핀 5에 연결합니다.servoHor.attach(6); //수평 서보를 6번 핀에 연결합니다. servoVer.write(90); ServoHor.write(90);} 무효 Pos(){ if(prevX !=x || prevY !=y) { int servoX =map(x, 600, 0, 70, 179); 정수 서보Y =맵(y, 450, 0, 179, 95); 서보X =최소(서보X, 179); 서보X =최대(서보X, 70); 서보Y =최소(서보Y, 179); 서보Y =최대(서보Y, 95); ServoHor.write(servoX); ServoVer.write(servoY); }} 무효 루프(){ if(Serial.available()> 0) { if(Serial.read() =='X') { x =Serial.parseInt(); if(Serial.read() =='Y') { y =Serial.parseInt(); 위치(); } } while(Serial.available()> 0) { Serial.read(); } }}

    제조공정

    1. Python 및 Raspberry Pi 온도 센서
    2. 실시간 얼굴 인식:종단 간 프로젝트
    3. 자동 비전 개체 추적
    4. Arduino만 사용하는 DTMF 디코더
    5. Arduino를 사용하여 모니터 Ambilight 만들기
    6. Python과 함께 Arduino 및 RFID를 사용한 출석 시스템
    7. ARDUINO를 사용하는 초음파 부상 기계
    8. Arduino와 스마트폰을 사용한 DIY 전압계
    9. IoT를 사용한 심박수 모니터
    10. Arduino Uno WiFi를 사용하는 WebServerBlink