1
0
mirror of https://github.com/undera/pylgbst.git synced 2020-11-18 19:37:26 -08:00

handle smile

This commit is contained in:
Andrey Pohilko 2018-08-01 18:02:17 +03:00
parent 4a6f948fc5
commit db80492597

View File

@ -12,12 +12,19 @@ from pylgbst import get_connection_auto
from pylgbst.comms import DebugServerConnection from pylgbst.comms import DebugServerConnection
from pylgbst.movehub import MoveHub from pylgbst.movehub import MoveHub
cascades_dir = '/usr/share/opencv/haarcascades'
face_cascade = cv2.CascadeClassifier(cascades_dir + '/haarcascade_frontalface_default.xml')
smile_cascade = cv2.CascadeClassifier(cascades_dir + '/haarcascade_smile.xml')
class FaceTracker(MoveHub): class FaceTracker(MoveHub):
def __init__(self, connection=None): def __init__(self, connection=None):
super(FaceTracker, self).__init__(connection) super(FaceTracker, self).__init__(connection)
self._is_smile_on = False
self.cur_img = None self.cur_img = None
self.cur_face = None self.cur_face = None
self.cur_smile = None
self.smile_counter = 0
def capture(self): def capture(self):
logging.info("Starting cam...") logging.info("Starting cam...")
@ -48,11 +55,56 @@ class FaceTracker(MoveHub):
cap.release() cap.release()
video.release() video.release()
face_cascade = cv2.CascadeClassifier('/usr/share/opencv/haarcascades/' + 'haarcascade_frontalface_default.xml') def _find_face(self):
bodies, rejects, weights = face_cascade.detectMultiScale3(self.cur_img, 1.5, 5, outputRejectLevels=True)
if len(bodies):
logging.debug("Bodies: %s / Weights: %s", bodies, weights)
else:
return None
items = []
for n in range(0, len(bodies)):
items.append((bodies[n], weights[n]))
self.cur_face = None
for item in sorted(items, key=lambda i: i[1], reverse=True):
return item[0]
return bodies
def _find_smile(self, cur_face):
(x, y, w, h) = cur_face
roi_color = self.cur_img[y:y + h, x:x + w]
smiles = smile_cascade.detectMultiScale(roi_color, 1.5)
logging.debug("Smiles: %s", smiles)
if not len(smiles):
self.cur_smile = None
self.smile_counter -= 1
else:
for (ex, ey, ew, eh) in smiles:
self.cur_smile = (ex, ey, ew, eh)
cv2.rectangle(roi_color, (ex, ey), (ex + ew, ey + eh), (0, 255, 0), 2)
self.smile_counter += 1
break
logging.info("Smile counter: %s", self.smile_counter)
if self.smile_counter > 2:
self.smile_counter = 2
self._smile(True)
if self.smile_counter < 0:
self.smile_counter = 0
self._smile(False)
def _smile(self, on=True):
if on and not self._is_smile_on:
self._is_smile_on = True
self.motor_B.angled(-90, 0.5)
if not on and self._is_smile_on:
self._is_smile_on = False
self.motor_B.angled(90, 0.5)
def _find_faces(self):
bodies, rejects, weights = self.face_cascade.detectMultiScale3(self.cur_img, 1.5, 5, outputRejectLevels=True)
return bodies, weights
def _find_color(self): def _find_color(self):
# from https://www.pyimagesearch.com/2015/09/14/ball-tracking-with-opencv/ # from https://www.pyimagesearch.com/2015/09/14/ball-tracking-with-opencv/
@ -116,25 +168,13 @@ class FaceTracker(MoveHub):
pyplot.show() pyplot.show()
while thr.isAlive() and self.connection.is_alive(): while thr.isAlive() and self.connection.is_alive():
# bodies, weights = self._find_color() self.cur_face = self._find_face()
bodies, weights = self._find_faces() if self.cur_face is None:
if len(bodies):
logging.debug("Bodies: %s / Weights: %s", bodies, weights)
else:
self.motor_external.stop() self.motor_external.stop()
self.motor_AB.stop() self.motor_AB.stop()
else:
items = []
for n in range(0, len(bodies)):
items.append((bodies[n], weights[n]))
self.cur_face = None
for item in sorted(items, key=lambda i: i[1], reverse=True):
self.cur_face = item[0]
self._auto_pan(self.cur_face) self._auto_pan(self.cur_face)
break self._find_smile(self.cur_face)
plt.set_array(self.cur_img) plt.set_array(self.cur_img)
logging.debug("Updated frame") logging.debug("Updated frame")
@ -156,4 +196,3 @@ if __name__ == '__main__':
finally: finally:
pass pass
# conn.disconnect() # conn.disconnect()