class HandTracker: def __init__(self, model="data/model/gopro.pkl", nframe=150, display=False): self._hd = HandsDetector(model) self._nframe = nframe self._tracker = None self._vc = None self._display = display def run(self, vf): fr = FrameReader(vf) # assert os.path.exists(vf), '! video file...' # self._vc = cv2.VideoCapture(vf) state = State(self._nframe) strum = Strum() # while self._vc.isOpened(): # try: # ret, frame = self._vc.read() # assert frame.any() # except AttributeError: # break for frame in fr.next(): frameg = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) if state.reinit(): hands = self._hd.run(frame) pts = hands.get_points() self._tracker = PointTracker(frameg, pts) else: pts = self._tracker.run(frameg) strum.append(pts) state.update() if self._display: self.__show_points(frame, pts) key = cv2.waitKey(1) if key == ord("q"): break elif key == ord("s"): hands.save("hands.pck") return strum def __show_points(self, frame, pts): frame = np.array(frame) for pt in pts: pt = pt.astype(np.int32) cv2.circle(frame, tuple(pt), 8, (255, 0, 0), -1) cv2.imshow("pts", frame)
class Test: def __init__(self, cmod="data/model/chords.pkl", smod="data/model/gopro.pkl"): self._hd = HandsDetector(smod) self._cd = ChordDetector(cmod) def run(self, vf): fr = FrameReader(vf) for frame in fr.next(): hands = self._hd.run(frame) frameg = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) ch = self._cd.run(frameg, hands.left) self.__show(frame, hands.left.box, ch) cv2.waitKey(4) def __show(self, frame, box, label): tmp = frame p, q = tuple(box[0]), tuple(box[1]) cv2.rectangle(tmp, p, q, (255, 0, 0), 2) cv2.putText(tmp, label, (p[0] + 10, p[1] - 10), cv2.FONT_HERSHEY_SIMPLEX, 1, 255, 3) cv2.imshow("chord", tmp)