Я использовал серводвигатели для 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
вот полный код
Не знаю, в чем конкретно проблема
Я даже не уверен, что проблема с частью кода
но я просто хочу изменить серводвигатели в соответствии с лицом