DGR,
Thank you much for real fast response!
I’m not adamant about using PWM but rather I don’t know much about coding in Arduino & Python.—Totally Newbie & can not or don’t know how to modify given code to suit my need—.
Naturally, I have to work with what is available for me to put things together with numerous research with minimal knowledge and try & error basis, without knowing what may work and may not, based on real scientific knowledge, and of course caused me to purchase bunch of stuff & testing plus disappointment.
My project was started to help people who can not stay still in front of video camera for video conferencing with their loved ones and does not recognize the importance of necessity being in the center of video camera centroid focal point and scared by servo gear noise, delayed response video reaction, high pitched brushless gimbal noise once in a while when sudden position changes.
I’ve used Adrian’s blog to implement Face Tracking, Deep Learning and Movidius implementation as I referred in my Youtube video, exception of Tensorflow adoption per Leigh jones that I could never make it work with Raspberry Pi4 due to coding incompatibility & complexity of Tensorflow implementation to Pi 4 about 1 or 1.5 year ago.
Adrian’s original python code & modified code version is based on PWM output & I don’t have any idea how to convert it to other format or method.
Main Python Code (Before Movidius) is provided as follows;# USAGE
python detect_faces_video.py --prototxt deploy.prototxt.txt --model res10_300x300_ssd_iter_140000.caffemodel
import the necessary packages
from imutils.video import VideoStream
import numpy as np
import argparse
import imutils
import time
import cv2
from imutils.video.pivideostream import PiVideoStream
from pantilthat import *
construct the argument parse and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument(“-p”, “–prototxt”, required=True,
help=“path to Caffe ‘deploy’ prototxt file”)
ap.add_argument(“-m”, “–model”, required=True,
help=“path to Caffe pre-trained model”)
ap.add_argument(“-c”, “–confidence”, type=float, default=0.5,
help=“minimum probability to filter weak detections”)
args = vars(ap.parse_args())
load our serialized model from disk
print(“[INFO] loading model…”)
net = cv2.dnn.readNetFromCaffe(args[“prototxt”], args[“model”])
Default Pan/Tilt for the camera in degrees.
Camera range is from -90 to 90
cam_pan = 90
cam_tilt = 60
initialize the video stream and allow the cammera sensor to warmup
print(“[INFO] starting video stream…”)
vs = PiVideoStream(vf=True,hf=False,framerate=25).start()
time.sleep(2.0)
Turn the camera to the default position
pan(cam_pan-90)
tilt(cam_tilt-90)
FRAME_W = 320
FRAME_H = 240
loop over the frames from the video stream
while True:
# grab the frame from the threaded video stream and resize it
# to have a maximum width of 400 pixels
frame = vs.read()
frame = imutils.resize(frame, width=400)
# grab the frame dimensions and convert it to a blob
(h, w) = frame.shape[:2]
blob = cv2.dnn.blobFromImage(cv2.resize(frame, (300, 300)), 1.0,
(300, 300), (104.0, 177.0, 123.0))
# pass the blob through the network and obtain the detections and
# predictions
net.setInput(blob)
detections = net.forward()
# loop over the detections
for i in range(0, detections.shape[2]):
# extract the confidence (i.e., probability) associated with the
# prediction
confidence = detections[0, 0, i, 2]
# filter out weak detections by ensuring the `confidence` is
# greater than the minimum confidence
if confidence < args["confidence"]:
continue
# compute the (x, y)-coordinates of the bounding box for the
# object
box = detections[0, 0, i, 3:7] * np.array([w, h, w, h])
(startX, startY, endX, endY) = box.astype("int")
# draw the bounding box of the face along with the associated
# probability
text = "{:.2f}%".format(confidence * 100)
y = startY - 10 if startY - 10 > 10 else startY + 10
cv2.rectangle(frame, (startX, startY), (endX, endY),
(0, 0, 255), 2)
cv2.putText(frame, text, (startX, y),
cv2.FONT_HERSHEY_SIMPLEX, 0.45, (0, 0, 255), 2)
# Track first face
# Get the center of the face
x = (startX+endX)/2
y = (startY+endY)/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.5 # VFOV
turn_y *= 2.5 # HFOV
cam_pan += turn_x
cam_tilt += turn_y
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
pan(int(cam_pan-90))
tilt(int(cam_tilt-90))
# show the output frame
cv2.imshow("Frame", frame)
key = cv2.waitKey(1) & 0xFF
# if the `q` key was pressed, break from the loop
if key == ord("q"):
break
do a bit of cleanup
cv2.destroyAllWindows()
vs.stop()