Path: blob/master/samples/python/feature_homography.py
16337 views
#!/usr/bin/env python12'''3Feature homography4==================56Example of using features2d framework for interactive video homography matching.7ORB features and FLANN matcher are used. The actual tracking is implemented by8PlaneTracker class in plane_tracker.py910Inspired by http://www.youtube.com/watch?v=-ZNYoL8rzPY1112video: http://www.youtube.com/watch?v=FirtmYcC0Vc1314Usage15-----16feature_homography.py [<video source>]1718Keys:19SPACE - pause video2021Select a textured planar object to track by drawing a box with a mouse.22'''2324# Python 2/3 compatibility25from __future__ import print_function2627import numpy as np28import cv2 as cv2930# local modules31import video32from video import presets33import common34from common import getsize, draw_keypoints35from plane_tracker import PlaneTracker363738class App:39def __init__(self, src):40self.cap = video.create_capture(src, presets['book'])41self.frame = None42self.paused = False43self.tracker = PlaneTracker()4445cv.namedWindow('plane')46self.rect_sel = common.RectSelector('plane', self.on_rect)4748def on_rect(self, rect):49self.tracker.clear()50self.tracker.add_target(self.frame, rect)5152def run(self):53while True:54playing = not self.paused and not self.rect_sel.dragging55if playing or self.frame is None:56ret, frame = self.cap.read()57if not ret:58break59self.frame = frame.copy()6061w, h = getsize(self.frame)62vis = np.zeros((h, w*2, 3), np.uint8)63vis[:h,:w] = self.frame64if len(self.tracker.targets) > 0:65target = self.tracker.targets[0]66vis[:,w:] = target.image67draw_keypoints(vis[:,w:], target.keypoints)68x0, y0, x1, y1 = target.rect69cv.rectangle(vis, (x0+w, y0), (x1+w, y1), (0, 255, 0), 2)7071if playing:72tracked = self.tracker.track(self.frame)73if len(tracked) > 0:74tracked = tracked[0]75cv.polylines(vis, [np.int32(tracked.quad)], True, (255, 255, 255), 2)76for (x0, y0), (x1, y1) in zip(np.int32(tracked.p0), np.int32(tracked.p1)):77cv.line(vis, (x0+w, y0), (x1, y1), (0, 255, 0))78draw_keypoints(vis, self.tracker.frame_points)7980self.rect_sel.draw(vis)81cv.imshow('plane', vis)82ch = cv.waitKey(1)83if ch == ord(' '):84self.paused = not self.paused85if ch == 27:86break878889if __name__ == '__main__':90print(__doc__)9192import sys93try:94video_src = sys.argv[1]95except:96video_src = 097App(video_src).run()9899100