#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
) для периодического запуска вашей функции.