| 139 | |
| 140 | |
| 141 | class App: |
| 142 | def __init__(self, src): |
| 143 | self.cap = video.create_capture(src, presets['book']) |
| 144 | self.frame = None |
| 145 | self.paused = False |
| 146 | self.tracker = PlaneTracker() |
| 147 | |
| 148 | cv2.namedWindow('plane') |
| 149 | self.rect_sel = common.RectSelector('plane', self.on_rect) |
| 150 | |
| 151 | def on_rect(self, rect): |
| 152 | self.tracker.add_target(self.frame, rect) |
| 153 | |
| 154 | def run(self): |
| 155 | while True: |
| 156 | playing = not self.paused and not self.rect_sel.dragging |
| 157 | if playing or self.frame is None: |
| 158 | ret, frame = self.cap.read() |
| 159 | if not ret: |
| 160 | break |
| 161 | self.frame = frame.copy() |
| 162 | |
| 163 | vis = self.frame.copy() |
| 164 | if playing: |
| 165 | tracked = self.tracker.track(self.frame) |
| 166 | for tr in tracked: |
| 167 | cv2.polylines(vis, [np.int32(tr.quad)], True, (255, 255, 255), 2) |
| 168 | for (x, y) in np.int32(tr.p1): |
| 169 | cv2.circle(vis, (x, y), 2, (255, 255, 255)) |
| 170 | |
| 171 | self.rect_sel.draw(vis) |
| 172 | cv2.imshow('plane', vis) |
| 173 | ch = cv2.waitKey(1) |
| 174 | if ch == ord(' '): |
| 175 | self.paused = not self.paused |
| 176 | if ch == ord('c'): |
| 177 | self.tracker.clear() |
| 178 | if ch == 27: |
| 179 | break |
| 180 | |
| 181 | if __name__ == '__main__': |
| 182 | print(__doc__) |