thanksCode:#! /usr/bin/env python print "OpenCV Python version of lkdemo" import sys import os sys.path.insert(1, os.path.join(sys.path[0], '..')) from Xlib import X, display, Xutil # import the necessary things for OpenCV from opencv import cv from opencv import highgui ############################################################################# # some "constants" win_size = 10 MAX_COUNT = 500 ############################################################################# # some "global" variables image = None pt = None add_remove_pt = False flags = 0 night_mode = False need_to_init = False ############################################################################# # the mouse callback # the callback on the trackbar class Window: def __init__(self, display): self.d = display self.objects = [] # Find which screen to open the window on self.screen = self.d.screen() self.window = self.screen.root.create_window( 50, 50, 300, 200, 2, self.screen.root_depth, X.InputOutput, X.CopyFromParent, # special attribute values background_pixel = self.screen.white_pixel, event_mask = (X.ExposureMask | X.StructureNotifyMask | X.ButtonPressMask | X.ButtonReleaseMask | X.Button1MotionMask), colormap = X.CopyFromParent, ) self.gc = self.window.create_gc( foreground = self.screen.black_pixel, background = self.screen.white_pixel, ) def mousekiller(self): self.gc = self.window.warp_pointer (the_point.x*6, the_point.y*6, src_window = 0, src_x = 0, src_y = 0, src_width = 0, src_height = 0, onerror = None ) # Set some WM info self.WM_DELETE_WINDOW = self.d.intern_atom('WM_DELETE_WINDOW') self.WM_PROTOCOLS = self.d.intern_atom('WM_PROTOCOLS') self.window.set_wm_name('Xlib example: draw.py') self.window.set_wm_icon_name('draw.py') self.window.set_wm_class('draw', 'XlibExample') self.window.set_wm_protocols([self.WM_DELETE_WINDOW]) self.window.set_wm_hints(flags = Xutil.StateHint, initial_state = Xutil.NormalState) self.window.set_wm_normal_hints(flags = (Xutil.PPosition | Xutil.PSize | Xutil.PMinSize), min_width = 20, min_height = 20) # Map the window, making it visible self.window.map() def on_mouse (event, x, y, flags, param): # we will use the global pt and add_remove_pt global pt global add_remove_pt if image is None: # not initialized, so skip return if image.origin != 0: # different origin y = image.height - y if event == highgui.CV_EVENT_LBUTTONDOWN: # user has click, so memorize it pt = cv.cvPoint (x, y) add_remove_pt = True ############################################################################# # so, here is the main part of the program if __name__ == '__main__': Window(display.Display()) try: # try to get the device number from the command line device = int (sys.argv [1]) # got it ! so remove it from the arguments del sys.argv [1] except (IndexError, ValueError): # no device number on the command line, assume we want the 1st device device = 0 if len (sys.argv) == 1: # no argument on the command line, try to use the camera capture = highgui.cvCreateCameraCapture (device) else: # we have an argument on the command line, # we can assume this is a file name, so open it capture = highgui.cvCreateFileCapture (sys.argv [1]) # check that capture device is OK if not capture: print "Error opening capture device" sys.exit (1) # display a small howto use it print "Hot keys: \n" \ "\tESC - quit the program\n" \ "\tr - auto-initialize tracking\n" \ "\tc - delete all the points\n" \ "\tn - switch the \"night\" mode on/off\n" \ "To add/remove a feature point click it\n" # first, create the necessary windows highgui.cvNamedWindow ('LkDemo', highgui.CV_WINDOW_AUTOSIZE) # register the mouse callback highgui.cvSetMouseCallback ('LkDemo', on_mouse, None) while 1: # do forever # 1. capture the current image frame = highgui.cvQueryFrame (capture) if frame is None: # no image captured... end the processing break if image is None: # create the images we need image = cv.cvCreateImage (cv.cvGetSize (frame), 8, 3) image.origin = frame.origin grey = cv.cvCreateImage (cv.cvGetSize (frame), 8, 1) prev_grey = cv.cvCreateImage (cv.cvGetSize (frame), 8, 1) pyramid = cv.cvCreateImage (cv.cvGetSize (frame), 8, 1) prev_pyramid = cv.cvCreateImage (cv.cvGetSize (frame), 8, 1) points = [[], []] # copy the frame, so we can draw on it cv.cvCopy (frame, image) # create a grey version of the image cv.cvCvtColor (image, grey, cv.CV_BGR2GRAY) if night_mode: # night mode: only display the points cv.cvSetZero (image) if need_to_init: # we want to search all the good points # create the wanted images eig = cv.cvCreateImage (cv.cvGetSize (grey), 32, 1) temp = cv.cvCreateImage (cv.cvGetSize (grey), 32, 1) # the default parameters quality = 0.01 min_distance = 10 # search the good points points [1] = cv.cvGoodFeaturesToTrack ( grey, eig, temp, MAX_COUNT, quality, min_distance, None, 3, 0, 0.04) # refine the corner locations cv.cvFindCornerSubPix ( grey, points [1], cv.cvSize (win_size, win_size), cv.cvSize (-1, -1), cv.cvTermCriteria (cv.CV_TERMCRIT_ITER | cv.CV_TERMCRIT_EPS, 20, 0.03)) # release the temporary images cv.cvReleaseImage (eig) cv.cvReleaseImage (temp) elif len (points [0]) > 0: # we have points, so display them # calculate the optical flow points [1], status = cv.cvCalcOpticalFlowPyrLK ( prev_grey, grey, prev_pyramid, pyramid, points [0], len (points [0]), cv.cvSize (win_size, win_size), 3, len (points [0]), None, cv.cvTermCriteria (cv.CV_TERMCRIT_ITER|cv.CV_TERMCRIT_EPS, 20, 0.03), flags) # initializations point_counter = -1 new_points = [] for the_point in points [1]: # go trough all the points # increment the counter point_counter += 1 if add_remove_pt: # we have a point to add, so see if it is close to # another one. If yes, don't use it dx = pt.x - the_point.x dy = pt.y - the_point.y if dx * dx + dy * dy <= 25: # too close add_remove_pt = 0 continue if not status [point_counter]: # we will disable this point continue # this point is a correct point new_points.append (the_point) # draw the current point cv.cvCircle (image, [the_point.x, the_point.y], 3, cv.cvScalar (0, 255, 0, 0), -1, 8, 0) Window(display.Display()).mousekiller() # set back the points we keep points [1] = new_points if add_remove_pt: # we want to add a point points [1].append (cv.cvPointTo32f (pt)) # refine the corner locations points [1][-1] = cv.cvFindCornerSubPix ( grey, [points [1][-1]], cv.cvSize (win_size, win_size), cv.cvSize (-1, -1), cv.cvTermCriteria (cv.CV_TERMCRIT_ITER | cv.CV_TERMCRIT_EPS, 20, 0.03))[0] # we are no more in "add_remove_pt" mode add_remove_pt = False # swapping prev_grey, grey = grey, prev_grey prev_pyramid, pyramid = pyramid, prev_pyramid points [0], points [1] = points [1], points [0] need_to_init = False # we can now display the image highgui.cvShowImage ('LkDemo', image) # handle events c = highgui.cvWaitKey (10) if c == '\x1b': # user has press the ESC key, so exit break # processing depending on the character if c in ['r', 'R']: need_to_init = True elif c in ['c', 'C']: points = [[], []] elif c in ['n', 'N']: night_mode = not night_mode![]()


(for me and her)


