Многопоточный скрипт OpenCV Python - PullRequest
0 голосов
/ 11 января 2019

Итак, мой босс подошел ко мне с проектом, чтобы сделать что-то довольно амбициозное, и это должно было привести в действие руку с экраном на конце до высоты лица пользователя. Как я это сделал, это использовал библиотеку распознавания лиц 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()

Когда нажимается концевой выключатель, либо один, он отступает назад в противоположном направлении, ожидая дальнейших координат или ожидая, пока другой пользователь не появится в потоке веб-камеры.

Все, что мне нужно, это многопоточность, любые комментарии или советы также приветствуются.

Спасибо за чтение.

...