Реализация многопоточности или многопроцессорности в распознавании лиц / приложение Tkinter

#multithreading #opencv #tkinter #python-multiprocessing #face-detection

#многопоточность #opencv #tkinter #python-многопроцессорность #распознавание лиц

Вопрос:

Итак, в основном у меня есть приложение, в котором есть рамка Tkinter заставки.

Мне нужно, чтобы этот фрейм закрывался, когда OpenCV обнаруживает лицо, после чего OpenCV открывает окно, в котором отображается лента камеры, и начинает отслеживать улыбки. Другие классы, инициализированные в приведенном ниже коде, предназначены для обновления базы данных и воспроизведения сигнала DTMF при распознавании улыбки, моя основная проблема заключается в том, что основной цикл из фрейма Tkinter не позволяет продолжать какие-либо другие процессы.

Мне также нужно, чтобы фрейм Tkinter закрывался при обнаружении лица. Прямо сейчас я попытался настроить его с помощью отдельного цикла распознавания лиц, предназначенного только для закрытия фрейма (класс frames имеет facefound() функцию, которая просто вызывает self.destroy() ).

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

Текущий код:

 import numpy as np
import sys
from imutils.video import VideoStream
import datetime
import argparse
import imutils
import time
import cv2
from chocolate_returner import Choco_returner
from given_resetter import Given_resetter
from tone_player import Tone_player
from play_flagger import Play_flagger
from Welcome_frame import Intro
import time


ap = argparse.ArgumentParser()
ap.add_argument("-p", "--picamera", type=int, default=-1,
                help="whether or not the Raspberry Pi camera should be used")
args = vars(ap.parse_args())



faceCascade = cv2.CascadeClassifier('faces.xml')
smileCascade = cv2.CascadeClassifier('smiles.xml')


cap = VideoStream(usePiCamera=args["picamera"] > 0).start()
time.sleep(2.0)


while True:

    framex = cap.read()  # Capture frame-by-frame
    frame = imutils.resize(framex, width=400)

    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    faces = faceCascade.detectMultiScale(
        gray,
        scaleFactor=1.1,
        minNeighbors=5,
        minSize=(30, 30),
        flags=0

    )
    # ---- Draw a rectangle around the faces

    for (x, y, w, h) in faces:
        cv2.rectangle(frame, (x, y), (x   w, y   h), (0, 255, 0), 2)
        print "found ", len(faces), "faces"
        roi_gray = gray[y:y   h, x:x   w]
        roi_color = frame[y:y   h, x:x   w]


        cv2.imshow('Video', frame)
        if cv2.waitKey(1) amp; 0xFF == ord('q'):
            break

    if (len(faces) > 0):
        check = True
        it.facefound()
        break


while True:

    framex = cap.read() # Capture frame-by-frame
    frame = imutils.resize(framex, width=400)


    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    faces = faceCascade.detectMultiScale(
        gray,
        scaleFactor= 1.1,
        minNeighbors=5,
        minSize=(30, 30),
        flags=0

    )
    # ---- Draw a rectangle around the faces

    for (x, y, w, h) in faces:
        cv2.rectangle(frame, (x, y), (x w, y h), (0, 255, 0), 2)
        print "found ", len(faces), "faces"
        roi_gray = gray[y:y h, x:x w]
        roi_color = frame[y:y h, x:x w]

        smile = smileCascade.detectMultiScale(
            roi_gray,
            scaleFactor= 1.7,
            minNeighbors=5,
            minSize=(5, 5),
            flags=0
        )
        time.sleep(2.0)
        # Set region of interest for smiles
        for (x, y, w, h) in smile:
            print "Found", len(smile), "smiles!"

            cv2.rectangle(roi_color, (x, y), (x w, y h), (255, 0, 0), 1)
            img = framex

            cv2.imwrite("test.jpg", img)

            cr = Choco_returner()
            gr = Given_resetter()
            tp = Tone_player()
            pf = Play_flagger()


            if (len(smile) > 0):

                return1 = cr.returner()
                tp.play(str(return1[1]), str(return1[2]))
                pf.flag(return1[0])


                #print "!!!!!!!!!!!!!!!!!"
                # Display the resulting frame
    cv2.imshow('Video', frame)
    if cv2.waitKey(1) amp; 0xFF == ord('q'):
        break




cap.release()
cv2.destroyAllWindows()
  

Комментарии:

1. tkinter должен tk.after(miliseconds, function_name) периодически запускать функцию. возможно, вы могли бы использовать его (вместо while True ) для периодического запуска вашей функции.