серводвигатели не работают должным образом для фейтракинг с использованием Pantilt - PullRequest
0 голосов
/ 02 июля 2019

Я использовал серводвигатели для Pantilt, чтобы отслеживать лица но дело в том, что сервопривод напрямую не связан с малиной вместо этого я использую 16-канальный adafruit pca9685 для управления сервоприводами все учебные пособия, в которых рассказывается о слежении за лицом с помощью малины, не используют такие каналы, поэтому я попытался выяснить, как это сделать

for frame in camera.capture_continuous(rawCapture, format = 'bgr', use_video_port = True):
        image = frame.array

        resized = cv2.resize(image, (320, 240))
        gray = cv2.cvtColor(resized,cv2.COLOR_BGR2GRAY)

        faces = face_cascade.detectMultiScale(gray, 1.1, 5)
        if len(faces) > 0:
            for (x, y, w, h) in faces:
                # Track(pan, tilt, Point(x + w/2.0, y+ h/2.0))
                break
        faces_resized = [(int(scale[0]*x), int(scale[1]*y), int(scale[0]*w), int(scale[1]*h)) for (x, y, w, h) in faces]
        for (x,y,w,h) in faces_resized:
            cv2.rectangle(image,(x,y),(x+w,y+h),(255,255,0),2)

к этой части кода абсолютно ясно, что лицо распознается идеально, но с помощью этого я хочу отслеживать и изменять положение моих серводвигателей

мне просто нужен код, который делает это Структура кода моей доски объявлений Adafruit

            pwm.set_pwm(0, 0,cam_pan)
0 for index of channels 
0 min angle

cam_pan угол, на который он должен двигаться

учитывая эти параметры, я просто хочу управлять движениями моего сервопривода / тангажа, чтобы они двигались соответственно

Я пытался управлять моторами через это

x = x + (w/2)
        y = y + (h/2)

        # Correct relative to center of image
        turn_x  = float(x - (FRAME_W/2))
        turn_y  = float(y - (FRAME_H/2))

        # Convert to percentage offset
        turn_x  /= float(FRAME_W/2)
        turn_y  /= float(FRAME_H/2)

        # Scale offset to degrees
    turn_x   = 2 # VFOV
    turn_y   = 2 # HFOV
    if x > turn_x:
        cam_pan  += -turn_x
        pwm.set_pwm(0, 0,cam_pan)
    elif x < turn_x:

        cam_pan  += +turn_x
        pwm.set_pwm(0, 0,cam_pan)

но бесполезные серводвигатели только начали немного дергаться

from picamera.array import PiRGBArray
from picamera import PiCamera
import time
import cv2
# from pisoc import *
import Adafruit_PCA9685
pwm = Adafruit_PCA9685.PCA9685()
FRAME_W = 180
FRAME_H = 100
cam_pan = 90
cam_tilt = 60

if __name__ == "__main__":

    camera = PiCamera()
    camera.resolution = (640, 480)
    camera.framerate = 32
    rawCapture = PiRGBArray(camera, size = camera.resolution)

    face_cascade = cv2.CascadeClassifier('/usr/local/share/OpenCV/lbpcascades/lbpcascade_frontalface.xml')

    scale = (camera.resolution[0]/320.0, camera.resolution[1]/240.0)

    time.sleep(0.1)

    for frame in camera.capture_continuous(rawCapture, format = 'bgr', use_video_port = True):
        image = frame.array

        resized = cv2.resize(image, (320, 240))
        gray = cv2.cvtColor(resized,cv2.COLOR_BGR2GRAY)

        faces = face_cascade.detectMultiScale(gray, 1.1, 5)
        if len(faces) > 0:
            for (x, y, w, h) in faces:
                # Track(pan, tilt, Point(x + w/2.0, y+ h/2.0))
                break
        faces_resized = [(int(scale[0]*x), int(scale[1]*y), int(scale[0]*w), int(scale[1]*h)) for (x, y, w, h) in faces]
        for (x,y,w,h) in faces_resized:
            cv2.rectangle(image,(x,y),(x+w,y+h),(255,255,0),2)
            # Track first face

            # Get the center of the face
            x = x + (w/2)
            y = y + (h/2)

            # Correct relative to center of image
            turn_x  = float(x - (FRAME_W/2))
            turn_y  = float(y - (FRAME_H/2))

            # Convert to percentage offset
            turn_x  /= float(FRAME_W/2)
            turn_y  /= float(FRAME_H/2)

            # Scale offset to degrees
        turn_x   = 2 # VFOV
        turn_y   = 2 # HFOV
        if x > turn_x:
            cam_pan  += -turn_x
            pwm.set_pwm(0, 0,cam_pan)
        elif x < turn_x:

            cam_pan  += +turn_x
            pwm.set_pwm(0, 0,cam_pan)
        # cam_tilt += turn_y


        # Clamp Pan/Tilt to 0 to 180 degrees
        # cam_pan = max(0,min(180,cam_pan))
        # cam_tilt = max(0,min(180,cam_tilt))

        # Update the servos
        # pwm.set_pwm(0, 0,cam_pan)

            # print(cam_pan-90, cam_tilt-90)
            #
            # # Clamp Pan/Tilt to 0 to 180 degrees
            # cam_pan = max(0,min(180,cam_pan))
            # # cam_tilt = max(0,min(180,cam_tilt))
            #
            # # Update the servos
            # pwm.set_pwm(0, 0,cam_pan)
            #
            # # pan(int(cam_pan-90))
            # # tilt(int(cam_tilt-90))

            break


        cv2.imshow("Result", image)
        key = cv2.waitKey(1) & 0xFF

        rawCapture.truncate(0)

        if key == ord('q') or key == 27:
            break

вот полный код

Не знаю, в чем конкретно проблема Я даже не уверен, что проблема с частью кода но я просто хочу изменить серводвигатели в соответствии с лицом

...