shavenwarthog

camshift #2

Jul 3rd, 2014
307
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.63 KB | None | 0 0
  1. #!/usr/bin/env python
  2.  
  3. # from multiprocessing import Process
  4. from threading import Thread
  5.  
  6. import numpy as np
  7.  
  8. import cv2
  9. import video
  10.  
  11. class App(object):
  12.     def __init__(self,iv):
  13.         self.cam = video.create_capture(iv)
  14.         #self.cam = cv2.VideoCapture(iv)
  15.         _ret, self.frame = self.cam.read()
  16.         #self.frame=self.frame[60:400,90:520]
  17.         cv2.namedWindow('camshift')
  18.         cv2.setMouseCallback('camshift', self.onmouse)
  19.  
  20.         self.selection = None
  21.         self.drag_start = None
  22.         self.tracking_state = 0
  23.         self.show_backproj = False
  24.         self.hist = None
  25.         self.track_window = None
  26.  
  27.     def onmouse(self, event, x, y, flags, param):
  28.         # print event,x,y,flags,param
  29.         x, y = np.int16([x, y]) # BUG
  30.         if event == cv2.EVENT_LBUTTONDOWN:
  31.             self.drag_start = (x, y)
  32.             print 'DRAG START:',self.drag_start
  33.             self.tracking_state = 0
  34.         elif self.drag_start and event == cv2.EVENT_LBUTTONUP:
  35.             h, w = self.frame.shape[:2]
  36.             xo, yo = self.drag_start
  37.             x0, y0 = np.maximum(0, np.minimum([xo, yo], [x, y]))
  38.             x1, y1 = np.minimum([w, h], np.maximum([xo, yo], [x, y]))
  39.             self.selection = None
  40.             if x1-x0 > 0 and y1-y0 > 0:
  41.                 self.selection = (x0, y0, x1, y1)
  42.             print 'DRAG STOP:',self.selection
  43.             self.drag_start = None
  44.             if self.selection is not None:
  45.                 self.tracking_state = 1
  46.  
  47.    
  48.  
  49.     def run(self):
  50.         while True:
  51.             _ret, self.frame = self.cam.read()
  52.             #self.frame=self.frame[60:400,90:520]
  53.             vis = self.frame.copy()
  54.             hsv = cv2.cvtColor(self.frame, cv2.COLOR_BGR2HSV)
  55.             mask = cv2.inRange(hsv, np.array((0., 60., 32.)), np.array((180., 255., 255.)))
  56.  
  57.             if self.selection:
  58.                 x0, y0, x1, y1 = self.selection
  59.                 self.track_window = (x0, y0, x1-x0, y1-y0)
  60.                 hsv_roi = hsv[y0:y1, x0:x1]
  61.                 mask_roi = mask[y0:y1, x0:x1]
  62.                 hist = cv2.calcHist( [hsv_roi], [0], mask_roi, [16], [0, 180] )
  63.                 cv2.normalize(hist, hist, 0, 255, cv2.NORM_MINMAX)
  64.                 self.hist = hist.reshape(-1)
  65.                 vis_roi = vis[y0:y1, x0:x1]
  66.                 cv2.bitwise_not(vis_roi, vis_roi)
  67.                 vis[mask == 0] = 0
  68.  
  69.             if self.tracking_state == 1:
  70.                 self.selection = None
  71.                 prob = cv2.calcBackProject([hsv], [0], self.hist, [0, 180], 1)
  72.                 prob &= mask
  73.                 term_crit = ( cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 1 )
  74.                 try:
  75.                     track_box, self.track_window = cv2.CamShift(prob, self.track_window, term_crit)
  76.                 except Exception as exc:
  77.                     print 'UHOH:',exc
  78.                 print track_box[0]
  79.                 if self.show_backproj:
  80.                     vis[:] = prob[...,np.newaxis]
  81.                 try:
  82.                     cv2.ellipse(vis, track_box, (0, 0, 255), 2)
  83.                 except Exception as exc:
  84.                     print 'UHOH:',exc
  85.                     print '\ttrack_box:',track_box
  86.                     continue
  87.  
  88.  
  89.             cv2.imshow('camshift', vis)
  90.  
  91.             ch = 0xFF & cv2.waitKey(5)
  92.             if ch == 27:
  93.                 break
  94.             if ch == ord('b'):
  95.                 self.show_backproj = not self.show_backproj
  96.         cv2.destroyAllWindows()
  97.  
  98.  
  99. if __name__ == '__main__':
  100.  
  101.     a=App(0)
  102.     # b=App(2)
  103.     aa=Thread(target=a.run)
  104.     # bb=Thread(target=b.run)
  105.     aa.start()
  106.     # bb.start()
Advertisement
Add Comment
Please, Sign In to add comment