Многопоточный скрипт OpenCV Python
Так что мой босс подошел ко мне с проектом, чтобы сделать что-то довольно амбициозное, и это должно было привести в действие руку с экраном на конце до высоты лица пользователя. Как я это сделал, это использовал библиотеку распознавания лиц OpenCV, поместил квадрат вокруг лица пользователя и вывел значение "Y" на терминал. С этим значением я отправил сигналы высокого и низкого уровня на микроконтроллер, который управляет шаговым двигателем, который перемещает рычаг вверх, вниз или удерживает его, если высота пользователя находится в "диапазоне".
Первоначально я использовал каскад Хаара в программе, но обнаружил, что он очень медленный. Затем я переключился на каскад LBP, который работает быстрее, но не так точно. Я обнаружил, что для того, чтобы программа не работала с задержкой, мне нужно было бы использовать многопоточность моего скрипта.
Я - исследователь и разработчик, который обычно занимается электротехникой, проводкой, распределением и т. Д. Я не программирую, поэтому это чудо, что я достиг этого. У меня есть код ниже, и любая помощь будет оценена, так как все другие форумы по многопоточности в Python находятся у меня над головой, так как я не могу полностью понять общеупотребительный язык Python.
import cv2
import sys
import RPi.GPIO as GPIO
import time
from threading import Thread
#assigning GPIO to BCM instead of board
GPIO.setmode(GPIO.BCM)
#HIGH and LOW output pins to microcontroller
GPIO.setup(23, GPIO.OUT)
GPIO.setup(24, GPIO.OUT)
#Limit switch input buttons
GPIO.setup(17, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(27, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
#cascade reference for facial detection
cascPath = "lbpcascade_frontalface.xml"
faceCascade = cv2.CascadeClassifier(cascPath)
video_capture = cv2.VideoCapture(0)
try:
while True: #Main loop
#assigning coordinates to variables
x = 0
y = 131
ret, frame = video_capture.read()
gray = cv2.cvtColor (frame, cv2.COLOR_BGR2GRAY)
faces = faceCascade.detectMultiScale(
gray,
scaleFactor=1.1,
minNeighbors=25,
minSize=(50, 50)
)
#outputing facial sqaure position to terminal
for (x, y, w, h) in faces:
cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 100, 0), 1)
print (x,y,"---",w,h)
cv2.imshow('Video', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cv2.imshow('Video', frame)
#output 23 cannot continue further after DownMax is hit. Continues in other
direction until switch isn't engaged anymore
if GPIO.input(27):
print "Down endstop is hit"
y = 132
GPIO.output(23, 0)
GPIO.output(24, 1)
#output 24 cannot continue further after UpMax is hit. " "
if GPIO.input(17):
print "Up endstop is hit"
y =132
GPIO.output(23, 1)
GPIO.output(24, 0)
#If the face Y-value is less than 130, move motor up
if (y < 130):
print "Y is less than 130"
GPIO.output(23, 1)
GPIO.output(24, 0)
del y
#If the face Y-value is more than 170, move motor down
elif (y > 170):
print "Y is more than 170"
GPIO.output(23, 0)
GPIO.output(24, 1)
del y
#If a face is not found, default to 131 so motors don't move
else:
y = 131
print "y is in range"
GPIO.output(23, 1)
GPIO.output(24, 1)
finally:
GPIO.cleanup()
video_capture.release()
cv2.destroyAllWindows()
Когда нажимается концевой выключатель, либо один, он отступает назад в противоположном направлении, чтобы дождаться дальнейших координат или подождать, пока другой пользователь не появится в потоке веб-камеры.
Все, что мне нужно, это многопоточность, любые комментарии или советы также очень ценятся.
Спасибо за чтение.