Raspberry Pi, Python3 및 Open CV에서 얼굴 추적 카메라

RaspberryPi 초보자입니다.RaspberryPi , 카메라, 서보 모터를 사용하여 얼굴 추적을 수행합니다.
@PonDad 씨의 기사를 참고로 했습니다. @PonDad 감사합니다.

Raspberry Pi 서보 모터와 Open CV에서 얼굴 추적 카메라 (Haar-like)

그러나 자신의 환경에서는 @PonDad의 기사대로 잘 작동하지 않았기 때문에 face_tracking.py를 다음과 같이 변경했습니다.


환경


  • Raspberry Pi3 (RASPBIAN JESSIE WITH PIXEL 4.4/Python 3.4.2)
  • Open CV 3.1.0
  • LOGICOOL 웹캠 HD 화질 120만 화소 C270
  • PCA9685 16Channel 12bit PWM (Adafruit 16-Channel Servo Driver 호환)
  • SG90 서보용 2축 카메라 마운트
  • 라즈파이 전원과 별도로 서보 전원으로 DC 어댑터 (5V 2A)를 PCA9685에 연결
  • 코드를 실행하려면 @PonDad기사 에서 소개된 PCA9685.py 가 필요합니다.

  • 개요


    OpenCVHaar-like特徴分類器 를 사용하여 얼굴 인식합니다.haarcascade_frontalface_alt.xml 를 이용한 얼굴 인식을 사용하면, cascade.detectMultiScale() 메소드를 이용해 얼굴의 범위를 나타내는 좌표를 취득할 수가 있습니다.
    이 좌표로부터 얼굴의 중심점의 좌표를 계산해, 스트리밍 화면의 중심점과 얼굴의 중심점의 차이가 줄어드는 방향으로, 서보 모터로 카메라를 이동합니다. 이 동작을 반복하면 카메라가 얼굴을 추적할 수 있습니다.

    코드 변경



    @PonDad 님의 기사에서 변경
  • line15 cap.set(4, 320) 에서 cap.set(4, 240) 로 변경했다. 데스크탑상에 ​​표시되는 스트리밍 이미지의 윈도우 사이즈를 320*240으로 했다.
  • line18에서 21을 추가했습니다. 코드를 실행할 때마다 카메라 방향을 초기값으로 되돌리기 위해. 서보 2개 모두 중립인 375( Min150~Max600이므로 (150+600)/2=375 )로 이동.
  • line23 이 줄을 while 문 앞에 냈다.
  • line27 now_degree_xnow_degree_y 를 서보의 중립인 375 로 변경.
  • line33에서 34 *0.4*0.06로 변경했습니다. 곱셈의 값을 여러가지 변경해 가장 움직임이 좋았던 값으로 변경했다. 이 부분은 시행 착오의 결과로 적절하게 결정되었다. 값이 클수록 빨리 움직이지만 너무 크면 지나친다. 자신의 환경에서는 0.04에서 0.06 정도가 좋은 느낌.
  • line34 160을 120으로 변경했다. line15의 변경에 수반하여, 스트리밍 화상의 중심점(=240/2)을 변경했다.
  • line38 time.sleep(0.1) 는 없어도 지장이 없었기 때문에 코멘트 아웃.
  • line39에서 40 now_degree_x = move_degree_xnow_degree_y = move_degree_y 로 변경했다.

  • 코드



    흠세_t 등 c 킨 g2. py

    face_tracking2.py
    # -*- coding: UTF-8 -*-
    import cv2
    import os
    import time
    import Adafruit_PCA9685
    
    pwm = Adafruit_PCA9685.PCA9685()
    pwm.set_pwm_freq(60)
    
    cascade_path = "haarcascade_frontalface_alt.xml"
    cascade = cv2.CascadeClassifier(cascade_path)
    
    cap = cv2.VideoCapture(0)
    cap.set(3, 320)
    cap.set(4, 240)
    color = (255, 255, 255)
    
    pwm.set_pwm(0, 0, 375)
    time.sleep(1)
    pwm.set_pwm(1, 0, 375)
    time.sleep(1)
    
    now_degree_x, now_degree_y, move_degree_x, move_degree_y = 375, 375, 0, 0
    
    while(True):
        ret, frame = cap.read()
        facerect = cascade.detectMultiScale(frame, scaleFactor=1.2, minNeighbors=2, minSize=(10, 10))
    
        for rect in facerect:
            img_x = rect[0]+rect[2]/2
            img_y = rect[1]+rect[3]/2
            print(img_x, img_y)
            move_degree_x = now_degree_x - (img_x-160)*0.06
            move_degree_y = now_degree_y + (img_y-120)*0.06
            print('deg: ', move_degree_x , move_degree_y)
            pwm.set_pwm(0, 0, int(move_degree_x))
            pwm.set_pwm(1, 0, int(move_degree_y))
            #time.sleep(0.1)
            now_degree_x = move_degree_x
            now_degree_y = move_degree_y
            cv2.circle(frame, (int(img_x), int(img_y)), 10, (255,255,255), -1)
            cv2.rectangle(frame, tuple(rect[0:2]),tuple(rect[0:2] + rect[2:4]), color, thickness=3)
    
        cv2.imshow("Show FLAME Image", frame)
    
        k = cv2.waitKey(1)
        if k == ord('q'):
            break
    
    cap.release()
    cv2.destroyAllWindows()
    

    감상 등



    얼굴 추적을 위한 서보 제어가 꽤 잘 되지 않고, 시행착오하면서 상기의 코드를 변경했습니다.
    프로그래밍이 전혀 모르는 초보자이므로 실수가 많이 있을지도 모릅니다. 누군가 지적해 주시면 감사하겠습니다.python face_tracking2.py 그렇다면 python2에서 작동하기 때문에 python3 face_tracking2.py에서 실행됩니다.

    좋은 웹페이지 즐겨찾기