Path: blob/master/modules/python/test/test_camshift.py
16337 views
#!/usr/bin/env python12'''3Camshift tracker4================56This is a demo that shows mean-shift based tracking7You select a color objects such as your face and it tracks it.8This reads from video camera (0 by default, or the camera number the user enters)910http://www.robinhewitt.com/research/track/camshift.html1112'''1314# Python 2/3 compatibility15from __future__ import print_function16import sys17PY3 = sys.version_info[0] == 31819if PY3:20xrange = range2122import numpy as np23import cv2 as cv24from tst_scene_render import TestSceneRender2526from tests_common import NewOpenCVTests, intersectionRate2728class camshift_test(NewOpenCVTests):2930framesNum = 30031frame = None32selection = None33drag_start = None34show_backproj = False35track_window = None36render = None37errors = 03839def prepareRender(self):4041self.render = TestSceneRender(self.get_sample('samples/data/pca_test1.jpg'), deformation = True)4243def runTracker(self):4445framesCounter = 046self.selection = True4748xmin, ymin, xmax, ymax = self.render.getCurrentRect()4950self.track_window = (xmin, ymin, xmax - xmin, ymax - ymin)5152while True:53framesCounter += 154self.frame = self.render.getNextFrame()55hsv = cv.cvtColor(self.frame, cv.COLOR_BGR2HSV)56mask = cv.inRange(hsv, np.array((0., 60., 32.)), np.array((180., 255., 255.)))5758if self.selection:59x0, y0, x1, y1 = self.render.getCurrentRect() + 5060x0 -= 10061y0 -= 1006263hsv_roi = hsv[y0:y1, x0:x1]64mask_roi = mask[y0:y1, x0:x1]65hist = cv.calcHist( [hsv_roi], [0], mask_roi, [16], [0, 180] )66cv.normalize(hist, hist, 0, 255, cv.NORM_MINMAX)67self.hist = hist.reshape(-1)68self.selection = False6970if self.track_window and self.track_window[2] > 0 and self.track_window[3] > 0:71self.selection = None72prob = cv.calcBackProject([hsv], [0], self.hist, [0, 180], 1)73prob &= mask74term_crit = ( cv.TERM_CRITERIA_EPS | cv.TERM_CRITERIA_COUNT, 10, 1 )75_track_box, self.track_window = cv.CamShift(prob, self.track_window, term_crit)7677trackingRect = np.array(self.track_window)78trackingRect[2] += trackingRect[0]79trackingRect[3] += trackingRect[1]8081if intersectionRate(self.render.getCurrentRect(), trackingRect) < 0.4:82self.errors += 18384if framesCounter > self.framesNum:85break8687self.assertLess(float(self.errors) / self.framesNum, 0.4)8889def test_camshift(self):90self.prepareRender()91self.runTracker()929394if __name__ == '__main__':95NewOpenCVTests.bootstrap()969798