1 #!/usr/bin/env python 2 3 ''' 4 Video capture sample. 5 6 Sample shows how VideoCapture class can be used to acquire video 7 frames from a camera of a movie file. Also the sample provides 8 an example of procedural video generation by an object, mimicking 9 the VideoCapture interface (see Chess class). 10 11 'create_capture' is a convinience function for capture creation, 12 falling back to procedural video in case of error. 13 14 Usage: 15 video.py [--shotdir <shot path>] [source0] [source1] ...' 16 17 sourceN is an 18 - integer number for camera capture 19 - name of video file 20 - synth:<params> for procedural video 21 22 Synth examples: 23 synth:bg=../cpp/lena.jpg:noise=0.1 24 synth:class=chess:bg=../cpp/lena.jpg:noise=0.1:size=640x480 25 26 Keys: 27 ESC - exit 28 SPACE - save current frame to <shot path> directory 29 30 ''' 31 32 import numpy as np 33 import cv2 34 from time import clock 35 from numpy import pi, sin, cos 36 import common 37 38 class VideoSynthBase(object): 39 def __init__(self, size=None, noise=0.0, bg = None, **params): 40 self.bg = None 41 self.frame_size = (640, 480) 42 if bg is not None: 43 self.bg = cv2.imread(bg, 1) 44 h, w = self.bg.shape[:2] 45 self.frame_size = (w, h) 46 47 if size is not None: 48 w, h = map(int, size.split('x')) 49 self.frame_size = (w, h) 50 self.bg = cv2.resize(self.bg, self.frame_size) 51 52 self.noise = float(noise) 53 54 def render(self, dst): 55 pass 56 57 def read(self, dst=None): 58 w, h = self.frame_size 59 60 if self.bg is None: 61 buf = np.zeros((h, w, 3), np.uint8) 62 else: 63 buf = self.bg.copy() 64 65 self.render(buf) 66 67 if self.noise > 0.0: 68 noise = np.zeros((h, w, 3), np.int8) 69 cv2.randn(noise, np.zeros(3), np.ones(3)*255*self.noise) 70 buf = cv2.add(buf, noise, dtype=cv2.CV_8UC3) 71 return True, buf 72 73 def isOpened(self): 74 return True 75 76 class Chess(VideoSynthBase): 77 def __init__(self, **kw): 78 super(Chess, self).__init__(**kw) 79 80 w, h = self.frame_size 81 82 self.grid_size = sx, sy = 10, 7 83 white_quads = [] 84 black_quads = [] 85 for i, j in np.ndindex(sy, sx): 86 q = [[j, i, 0], [j+1, i, 0], [j+1, i+1, 0], [j, i+1, 0]] 87 [white_quads, black_quads][(i + j) % 2].append(q) 88 self.white_quads = np.float32(white_quads) 89 self.black_quads = np.float32(black_quads) 90 91 fx = 0.9 92 self.K = np.float64([[fx*w, 0, 0.5*(w-1)], 93 [0, fx*w, 0.5*(h-1)], 94 [0.0,0.0, 1.0]]) 95 96 self.dist_coef = np.float64([-0.2, 0.1, 0, 0]) 97 self.t = 0 98 99 def draw_quads(self, img, quads, color = (0, 255, 0)): 100 img_quads = cv2.projectPoints(quads.reshape(-1, 3), self.rvec, self.tvec, self.K, self.dist_coef) [0] 101 img_quads.shape = quads.shape[:2] + (2,) 102 for q in img_quads: 103 cv2.fillConvexPoly(img, np.int32(q*4), color, cv2.CV_AA, shift=2) 104 105 def render(self, dst): 106 t = self.t 107 self.t += 1.0/30.0 108 109 sx, sy = self.grid_size 110 center = np.array([0.5*sx, 0.5*sy, 0.0]) 111 phi = pi/3 + sin(t*3)*pi/8 112 c, s = cos(phi), sin(phi) 113 ofs = np.array([sin(1.2*t), cos(1.8*t), 0]) * sx * 0.2 114 eye_pos = center + np.array([cos(t)*c, sin(t)*c, s]) * 15.0 + ofs 115 target_pos = center + ofs 116 117 R, self.tvec = common.lookat(eye_pos, target_pos) 118 self.rvec = common.mtx2rvec(R) 119 120 self.draw_quads(dst, self.white_quads, (245, 245, 245)) 121 self.draw_quads(dst, self.black_quads, (10, 10, 10)) 122 123 124 classes = dict(chess=Chess) 125 126 presets = dict( 127 empty = 'synth:', 128 lena = 'synth:bg=../cpp/lena.jpg:noise=0.1', 129 chess = 'synth:class=chess:bg=../cpp/lena.jpg:noise=0.1:size=640x480' 130 ) 131 132 133 def create_capture(source = 0, fallback = presets['chess']): 134 '''source: <int> or '<int>|<filename>|synth [:<param_name>=<value> [:...]]' 135 ''' 136 source = str(source).strip() 137 chunks = source.split(':') 138 # hanlde drive letter ('c:', ...) 139 if len(chunks) > 1 and len(chunks[0]) == 1 and chunks[0].isalpha(): 140 chunks[1] = chunks[0] + ':' + chunks[1] 141 del chunks[0] 142 143 source = chunks[0] 144 try: source = int(source) 145 except ValueError: pass 146 params = dict( s.split('=') for s in chunks[1:] ) 147 148 cap = None 149 if source == 'synth': 150 Class = classes.get(params.get('class', None), VideoSynthBase) 151 try: cap = Class(**params) 152 except: pass 153 else: 154 cap = cv2.VideoCapture(source) 155 if 'size' in params: 156 w, h = map(int, params['size'].split('x')) 157 cap.set(cv2.cv.CV_CAP_PROP_FRAME_WIDTH, w) 158 cap.set(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT, h) 159 if cap is None or not cap.isOpened(): 160 print 'Warning: unable to open video source: ', source 161 if fallback is not None: 162 return create_capture(fallback, None) 163 return cap 164 165 if __name__ == '__main__': 166 import sys 167 import getopt 168 169 print __doc__ 170 171 args, sources = getopt.getopt(sys.argv[1:], '', 'shotdir=') 172 args = dict(args) 173 shotdir = args.get('--shotdir', '.') 174 if len(sources) == 0: 175 sources = [ 0 ] 176 177 caps = map(create_capture, sources) 178 shot_idx = 0 179 while True: 180 imgs = [] 181 for i, cap in enumerate(caps): 182 ret, img = cap.read() 183 imgs.append(img) 184 cv2.imshow('capture %d' % i, img) 185 ch = 0xFF & cv2.waitKey(1) 186 if ch == 27: 187 break 188 if ch == ord(' '): 189 for i, img in enumerate(imgs): 190 fn = '%s/shot_%d_%03d.bmp' % (shotdir, i, shot_idx) 191 cv2.imwrite(fn, img) 192 print fn, 'saved' 193 shot_idx += 1 194 cv2.destroyAllWindows()
第133行:create_capture(source = 0, fallback = presets['chess']) 有兩個參數 source 用於指示在哪裏獲取視頻源。fallback ------------python
聲明:s爲字符串,rm爲要刪除的字符序列app
s.strip(rm) 刪除s字符串中開頭、結尾處,位於 rm刪除序列的字符ide
s.lstrip(rm) 刪除s字符串中開頭處,位於 rm刪除序列的字符ui
s.rstrip(rm) 刪除s字符串中結尾處,位於 rm刪除序列的字符spa
當rm爲空時,默認刪除空白符(包括'\n', '\r', '\t', ' ')3d
總結 開啓數據採集設備並返回 控制句柄。
code