def main(): fmf_filename = sys.argv[1] fmf = fmf_mod.FlyMovie(fmf_filename) frame,timestamp = fmf.get_next_frame() frame = convert(frame,fmf.format) w = window.Window(visible=False, resizable=True) aii = ArrayInterfaceImage(frame) img = aii.texture w.width = img.width w.height = img.height w.set_visible() prev_n_frames = None while not w.has_exit: # TODO add some throttling here... w.dispatch_events() n_frames=fmf.compute_n_frames_from_file_size(only_full_frames=True) if prev_n_frames != n_frames: prev_n_frames = n_frames fmf.seek(n_frames-1) frame,timestamp = fmf.get_next_frame() frame = convert(frame,fmf.format) aii.view_new_array(frame) img.blit(0, 0, 0) w.flip()
def main(): fmf_filename = [] directory = './' if len(sys.argv) > 1: argin = sys.argv[1] if argin[-3:] == 'fmf': fmf_filename = argin else: directory = argin if fmf_filename == []: filenames = os.listdir(directory) mtimes = np.zeros(len(filenames)) for f,filename in enumerate(filenames): if filename[-3:] == 'fmf': mtimes[f] = os.path.getmtime(os.path.join(directory,filename)) inds = np.argsort(mtimes) fmf_filename = os.path.join(directory,filenames[inds[-1]]) print directory print fmf_filename fmf = fmf_mod.FlyMovie(fmf_filename) frame,timestamp = fmf.get_next_frame() frame = convert(frame,fmf.format) w = window.Window(visible=False, resizable=True) aii = ArrayInterfaceImage(frame) img = aii.texture w.width = img.width w.height = img.height w.set_visible() prev_n_frames = None while not w.has_exit: # TODO add some throttling here... w.dispatch_events() n_frames=fmf.compute_n_frames_from_file_size(only_full_frames=True) if prev_n_frames != n_frames: prev_n_frames = n_frames fmf.seek(n_frames-1) frame,timestamp = fmf.get_next_frame() frame = convert(frame,fmf.format) aii.view_new_array(frame) img.blit(0, 0, 0) w.flip()
class GameInterface(Interface): attack: AttackPattern = None aii: ArrayInterfaceImage = None background_sprite: Sprite = None batch: Batch = None border: Rectangle = None enemy: Enemy = None image = None facecam: Facecam = None face_cascade = None foreground_sprite: Sprite = None fps_display: FPSDisplay = None keys = key.KeyStateHandler() player: Player = None projectiles: List[Projectile] = [] powerup: Powerup = None scheduled_functions = tuple() def __init__(self): super().__init__() window = system.get_window() gl.glEnable(gl.GL_BLEND) gl.glBlendFunc(gl.GL_SRC_ALPHA, gl.GL_ONE_MINUS_SRC_ALPHA) base_path = os.path.join('images', 'space_background_pack', 'layers') self.background = load(os.path.join(base_path, 'parallax-space-background.png')) self.background_sprite = Sprite(self.background) big_planet = load(os.path.join(base_path, 'parallax-space-big-planet.png')) self.big_planet_sprite = Sprite(big_planet) far_planet = load(os.path.join(base_path, 'parallax-space-far-planets.png')) self.far_planet_sprite = Sprite(far_planet) ring_planet = load(os.path.join(base_path, 'parallax-space-ring-planet.png')) self.ring_planet_sprite = Sprite(ring_planet) self.ring_planet_sprite.x = 100 self.ring_planet_sprite.y = 100 stars = load(os.path.join(base_path, 'parallax-space-stars.png')) self.stars_sprite = Sprite(stars) self.scheduled_functions = ( (self.randomize_projectiles, 2), (self.check_direction, 1 / 120), (self.generate_powerup, 20) ) if config.get_config('control') == 1: self.face_cascade = cv.CascadeClassifier( 'venv/Lib/site-packages/cv2/data/haarcascade_frontalface_default.xml') self.facecam = Facecam(face_cascade=self.face_cascade).start() self.aii = ArrayInterfaceImage(self.facecam.read(), 'BGR') self.image = self.aii.texture @self.facecam.event('on_face_move') def follow_face(x, y, width, height): # Need to flip things first to work x = self.image.width - x y = self.image.height - y new_x = self.border.x + x - width // 2 new_y = self.border.y + y - height // 2 self.player.move(new_x, new_y) self.scheduled_functions = ( (self.randomize_projectiles, 2), (self.generate_powerup, 20), ) window.push_handlers(self.facecam) self.player = Player(src='images/ufo.png') self.border = Rectangle( width=(500 if not self.image else self.image.width) + 10, height=(500 if not self.image else self.image.height) + 10, color=(0, 0, 0, 127) ) self.player.scale = 1.2 self.batch = Batch() self.projectiles: List[Projectile] = [] window.push_handlers(self.keys) def pause_game(symbol, modifiers): if symbol == key.ESCAPE: self.enemy.running = not self.enemy.running self.enemy.attack_pattern.running = not self.enemy.attack_pattern.running self.player.running = not self.player.running window.on_key_press = pause_game for func, interval in self.scheduled_functions: clock.schedule_interval(func, interval) self.fps_display = FPSDisplay(window) self.generate_enemy(0) self.resize() def generate_enemy(self, dt): enemy_index = config.get_config('enemy') if enemy_index > len(enemies) - 1: return system.get_window().load_interface(WinInterface()) window = system.get_window() self.enemy = enemies[enemy_index](self.batch, speed=100) self.enemy.move(window.width * 0.8, window.height / 2) self.enemy.next_x, self.enemy.next_y = self.enemy.x, self.enemy.y def on_die(): config.set_config('enemy', config.get_config('enemy') + 1) clock.schedule_once(self.generate_enemy, 2) self.enemy.on_die = on_die def resize(self): window = system.get_window() scale = window.width / self.background.width self.background_sprite.scale = scale self.big_planet_sprite.scale = scale / 2 self.far_planet_sprite.scale = scale / 2 self.ring_planet_sprite.scale = scale / 2 self.stars_sprite.scale = scale self.big_planet_sprite.x = window.width / 2 self.big_planet_sprite.y = window.height / 2 self.far_planet_sprite.x = window.width - self.far_planet_sprite.width self.far_planet_sprite.y = window.height - self.far_planet_sprite.height if self.image: self.image.x = (window.width - self.image.width) / 2 self.image.y = (window.height - self.image.height) / 2 self.border.x = window.width / 2 * 0.3 self.border.y = (window.height - self.border.height) / 2 self.generate_powerup(0) self.player.move(x=window.width / 2 * 0.3, y=window.height / 2) def on_draw(self): self.animate_background() self.background_sprite.draw() self.big_planet_sprite.draw() self.far_planet_sprite.draw() self.ring_planet_sprite.draw() self.stars_sprite.draw() self.border.draw() if self.facecam: img = self.facecam.read() img = cv.flip(img, -1) self.image.blit(self.border.x, self.border.y, 0) self.aii.view_new_array(img) # self.fps_display.draw() self.player.draw() self.batch.draw() # self.attack.draw() if self.enemy: self.enemy.draw() if self.powerup: self.powerup.forward() self.powerup.draw() if self.player.check_for_collision(self.powerup): self.powerup.on_collide(self.player) self.powerup.delete() self.powerup = None def animate_background(self): big_planet_sprite_depth = 3 far_planet_sprite_depth = 10 ring_planet_sprite_depth = 5 stars_sprite_depth = 8 window = system.get_window() self.big_planet_sprite.x = self.big_planet_sprite.x - 1 * (1 / big_planet_sprite_depth) if self.big_planet_sprite.x + self.big_planet_sprite.width <= 0: self.big_planet_sprite.x = window.width self.far_planet_sprite.x = self.far_planet_sprite.x - 1 * (1 / far_planet_sprite_depth) if self.far_planet_sprite.x + self.far_planet_sprite.width <= 0: self.far_planet_sprite.x = window.width self.ring_planet_sprite.x = self.ring_planet_sprite.x - 1 * (1 / ring_planet_sprite_depth) if self.ring_planet_sprite.x + self.ring_planet_sprite.width <= 0: self.ring_planet_sprite.x = window.width self.stars_sprite.x = self.stars_sprite.x - 1 * (1 / stars_sprite_depth) if self.stars_sprite.x + self.stars_sprite.width <= 0: self.stars_sprite.x = window.width def generate_powerup(self, dt): window = system.get_window() # roll = random.randint(1, 10) roll = 1 if roll <= 3: # 30% chance of getting a powerup powerup = random.choice(powerups)(batch=self.batch) x = random.randint(int(self.border.x), int(self.border.x + self.border.width)) powerup.move(x=x, y=window.height) @powerup.movement def movement(): powerup.move(powerup.x, powerup.y - powerup.calculate_speed()) self.powerup = powerup def randomize_projectiles(self, dt): if self.enemy: self.enemy.attack_pattern.generate() def check_direction(self, dt): unit = 500 * dt if self.keys[key.DOWN]: if self.player.get_bot_bound() - unit >= self.border.y: self.player.move(self.player.x, self.player.y - unit) elif self.keys[key.UP]: if self.player.get_bot_bound() + self.player.height + unit <= self.border.y + self.border.height: self.player.move(self.player.x, self.player.y + unit) # self.player.y += unit if self.keys[key.LEFT]: if self.player.get_left_bound() - unit >= self.border.x: self.player.move(self.player.x - unit, self.player.y) elif self.keys[key.RIGHT]: if self.player.get_left_bound() + self.player.width + unit <= self.border.x + self.border.width: self.player.move(self.player.x + unit, self.player.y) # if self.keys[key.ESCAPE]: # fg_ratio = 0.4 # bg_ratio = 0.1 # self.foreground_sprite.x = (window.width * (1 + fg_ratio)) / 2 - self.player.x * fg_ratio # self.foreground_sprite.y = (window.height * (1 + fg_ratio)) / 2 - self.player.y * fg_ratio # self.background_sprite.x = (window.width * (1 + bg_ratio)) / 2 - self.player.x * bg_ratio # self.background_sprite.y = (window.height * (1 + bg_ratio)) / 2 - self.player.y * bg_ratio def clean(self): self.enemy.clean() if self.facecam: self.facecam.clean() print(f'Deleting {self}') super().clean()
def get_centers(filenames,showFrames=0,ROI=None,THRESH=1.5,ringR=.25, background=None): """find center of fly in fmf files, returns record array with x,y and time arguments: filename list of .fmf movie files or single .fmf movie file showFrames 0 [default] or 1 ROI 4-tuple of region of interest (top, bottom, left, right) or None (whole frame) THRESH threshold for number of std for pixel to be counted as foreground (default 1.5) ringR inner radius for mask (default .25) background background image (default None) example: centers = get_centers('/home/cardini/data/fly07/flyN20100317_185940.fmf',0,(9,15,12,12)) """ if isinstance(filenames,str): filenames = [filenames] if ROI is not None: top, bottom, left, right = ROI else: top, bottom, left, right = (1,0,0,1) COLOR = True ZOOM = 2 FRAMESTEP = 100 ended_early = False cents = [] lenOutStr = 0 for f,filename in enumerate(filenames): if filename[-3:] == 'fmf': fmf = FMF.FlyMovie(filename) nFrames = fmf.get_n_frames() frame,timestamp = fmf.get_frame(0) ROIFrame = frame[bottom:-top,left:-right] ## mask to eliminate points in corner -> 'ring' mask height,width = ROIFrame.shape R = numpy.floor(width/2) x0,y0 = R,R if numpy.mod(x0,2)==0: x0,y0 = x0-.5,y0-.5 x = numpy.matrix(range(width)) y = numpy.transpose(numpy.matrix(range(height))) xx = numpy.array((0*y+1)*x - y0) yy = numpy.array(y*(0*x+1) - x0) radius = numpy.sqrt(xx**2 + yy**2) ring = (radius<R) & (radius>R*ringR) ## end mask stuff if showFrames: dispFrame = convert(ROIFrame,fmf.format) if COLOR == True: dispFrame = numpy.array([dispFrame,dispFrame,dispFrame]) dispFrame = numpy.swapaxes(dispFrame,0,2) dispFrame = numpy.swapaxes(dispFrame,0,1) dispFrame = numpy.repeat(dispFrame,ZOOM,axis=0) dispFrame = numpy.repeat(dispFrame,ZOOM,axis=1) wnd = window.Window(visible=False, resizable=True) aii = ArrayInterfaceImage(dispFrame) img = aii.texture wnd.width = img.width wnd.height = img.height wnd.set_caption(filename[-23:]) wnd.set_visible() for frameNumber in range(nFrames): frame,timestamp = fmf.get_frame(frameNumber) ROIFrame = frame[bottom:-top,left:-right] if background is not None: ROIFrame = ROIFrame - background threshFrame = (ROIFrame < numpy.mean(ROIFrame) - THRESH*numpy.std(ROIFrame)) & (ring) #mask stuff h,w = threshFrame.shape X = numpy.arange(w) Y = numpy.arange(h) cX = numpy.sum(numpy.sum(threshFrame,0)*X)/numpy.sum(threshFrame) cY = numpy.sum(numpy.sum(threshFrame,1)*Y)/numpy.sum(threshFrame) if numpy.mod(frameNumber,FRAMESTEP) == 0: outStr = str(frameNumber)+' of '+ str(nFrames) sys.stdout.write("%s%s\r" % (outStr, " "*lenOutStr )) lenOutStr = len(outStr) sys.stdout.flush() if showFrames: if wnd.has_exit: ended_early=True break wnd.dispatch_events() #dispFrame = convert(ROIFrame,fmf.format) #dispFrame = ROIFrame.astype(numpy.uint8) #dispFrame[~ring]=dispFrame[~ring]/4 dispFrame = threshFrame.astype(numpy.uint8)*155 +100 if ~numpy.isnan(cY) and ~numpy.isnan(cY): dispFrame[round(cY),round(cX)] = 0 if COLOR == True: dispFrame = numpy.array([dispFrame,dispFrame,dispFrame]) dispFrame = numpy.swapaxes(dispFrame,0,2) dispFrame = numpy.swapaxes(dispFrame,0,1) dispFrame[ring,2]=255 if ~numpy.isnan(cY) and ~numpy.isnan(cY): dispFrame[round(cY),round(cX),0] = 255 dispFrame = numpy.repeat(dispFrame,ZOOM,axis=0) dispFrame = numpy.repeat(dispFrame,ZOOM,axis=1) aii.view_new_array(dispFrame) img.blit(0, 0, 0) wnd.flip() cents.append((cX,cY,timestamp)) if showFrames: wnd.close() centers = numpy.rec.fromarrays(numpy.transpose(cents), [('x',numpy.float),('y',numpy.float),('t',numpy.float)]) if showFrames: pylab.figure() #pylab.scatter(centers.x,centers.y,s=1) pylab.plot(centers.x,centers.y) pylab.draw() if ended_early: centers = None return centers
img = aii.texture checks = image.create(32, 32, image.CheckerImagePattern()) background = image.TileableTexture.create_for_image(checks) w.width = img.width w.height = img.height w.set_visible() glEnable(GL_BLEND) glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) i=0 while not w.has_exit: w.dispatch_events() background.blit_tiled(0, 0, 0, w.width, w.height) img.blit(0, 0, 0) w.flip() if filename is None and 1: # modify numpy array in-place arr.fill(i) aii.dirty() # dirty the ArrayInterfaceImage because the data changed i=(i+1)%256 if i == 1 and 0: arr = numpy.ones_like( arr ) # create a new array aii.view_new_array(arr) # switch ArrayInterfaceImage to view the new array
def play(frames, delay=0, magnify=1, background=None, blit_position=None, show_frame_number=True): w = window.Window(visible=False, resizable=True) arr = numpy.zeros([100, 100], dtype=numpy.uint8) aii = ArrayInterfaceImage(arr) img = aii.texture if background is None: checks = image.create(32, 32, image.CheckerImagePattern()) background = image.TileableTexture.create_for_image(checks) background_tiled = True else: if background.dtype != np.uint8: 'converting background to uint8' background = np.array(background, dtype=np.uint8) * 255 background_aii = ArrayInterfaceImage(background) background = background_aii.texture background_tiled = False if background_tiled: w.width = img.width w.height = img.height w.set_visible() else: w.width = background.width w.height = background.height w.set_visible() LIBGL_ALWAYS_SOFTWARE = 1 glEnable(GL_BLEND) glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) for i, f in enumerate(frames): arr = f if arr is not None: if arr.dtype != np.uint8: 'converting' arr = np.array(arr, dtype=np.uint8) * 255 if magnify != 1: newshape = [arr.shape[0] * magnify, arr.shape[1] * magnify] arr = nim.rebin(arr, newshape) try: aii.view_new_array(arr) except: # size changed print 'size changed!' #w.width = arr.shape[1] #w.height = arr.shape[0] aii = ArrayInterfaceImage(arr) img = aii.texture w.dispatch_events() w.clear() if background_tiled: background.blit_tiled(0, 0, 0, 100, 100) #w.width, w.height) else: background.blit(0, 0, 0) # add some overlays: if show_frame_number: s = 'frame: ' + str(i) label = pyglet.text.Label(s, font_name='courier', font_size=36, x=10, y=10) label.draw() if blit_position is None: img.blit(0, 0, 0) else: img.blit(blit_position[i][1], blit_position[i][0], 0) #frame_number_text.draw() if 0: r = arr.shape[0] / 2. body_axis = npmovie.kalmanobj.long_axis[f] wing_axis = npmovie.kalmanobj.wingaxisR[f] wing_center = npmovie.kalmanobj.wingcenterR[f] #print wing_center, wing_axis if mode == 'wingimgR': print f, uframe.wingimgR.sum() pyglet.graphics.draw( 2, pyglet.gl.GL_LINES, ('v2i', (int(r), int(r), int(body_axis[1] * 10 * magnify) + int(r), int(body_axis[0] * 10 * magnify) + int(r)))) try: pyglet.graphics.draw( 2, pyglet.gl.GL_LINES, ('v2i', (int(r), int(r), int(wing_center[1] * magnify), int(wing_center[0] * magnify)))) pyglet.graphics.draw(1, pyglet.gl.GL_POINTS, ('v2i', (int(wing_center[1] * magnify), int(wing_center[0] * magnify)))) pass except: pass w.flip() time.sleep(delay) # slow down the playback w.close()
def play(frames, delay=0, magnify=1, background=None, blit_position=None, show_frame_number=True): w = window.Window(visible=False, resizable=True) arr = numpy.zeros([100,100], dtype=numpy.uint8) aii = ArrayInterfaceImage(arr) img = aii.texture if background is None: checks = image.create(32, 32, image.CheckerImagePattern()) background = image.TileableTexture.create_for_image(checks) background_tiled = True else: if background.dtype != np.uint8: 'converting background to uint8' background = np.array(background, dtype=np.uint8)*255 background_aii = ArrayInterfaceImage(background) background = background_aii.texture background_tiled = False if background_tiled: w.width = img.width w.height = img.height w.set_visible() else: w.width = background.width w.height = background.height w.set_visible() LIBGL_ALWAYS_SOFTWARE = 1 glEnable(GL_BLEND) glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) for i, f in enumerate(frames): arr = f if arr is not None: if arr.dtype != np.uint8: 'converting' arr = np.array(arr, dtype=np.uint8)*255 if magnify != 1: newshape = [arr.shape[0]*magnify, arr.shape[1]*magnify] arr = nim.rebin(arr, newshape) try: aii.view_new_array(arr) except: # size changed print 'size changed!' #w.width = arr.shape[1] #w.height = arr.shape[0] aii = ArrayInterfaceImage(arr) img = aii.texture w.dispatch_events() w.clear() if background_tiled: background.blit_tiled(0, 0, 0, 100, 100) #w.width, w.height) else: background.blit(0,0,0) # add some overlays: if show_frame_number: s = 'frame: ' + str(i) label = pyglet.text.Label(s, font_name='courier', font_size=36, x=10, y=10) label.draw() if blit_position is None: img.blit(0, 0, 0) else: img.blit(blit_position[i][1], blit_position[i][0], 0) #frame_number_text.draw() if 0: r = arr.shape[0]/2. body_axis = npmovie.kalmanobj.long_axis[f] wing_axis = npmovie.kalmanobj.wingaxisR[f] wing_center = npmovie.kalmanobj.wingcenterR[f] #print wing_center, wing_axis if mode == 'wingimgR': print f, uframe.wingimgR.sum() pyglet.graphics.draw(2, pyglet.gl.GL_LINES,('v2i', (int(r), int(r), int(body_axis[1]*10*magnify)+int(r), int(body_axis[0]*10*magnify)+int(r)))) try: pyglet.graphics.draw(2, pyglet.gl.GL_LINES,('v2i', (int(r), int(r), int(wing_center[1]*magnify), int(wing_center[0]*magnify)))) pyglet.graphics.draw(1, pyglet.gl.GL_POINTS,('v2i', (int(wing_center[1]*magnify), int(wing_center[0]*magnify)))) pass except: pass w.flip() time.sleep(delay) # slow down the playback w.close()
img = aii.texture checks = image.create(32, 32, image.CheckerImagePattern()) background = image.TileableTexture.create_for_image(checks) w.width = img.width w.height = img.height w.set_visible() glEnable(GL_BLEND) glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) i = 0 while not w.has_exit: w.dispatch_events() background.blit_tiled(0, 0, 0, w.width, w.height) img.blit(0, 0, 0) w.flip() if filename is None and 1: # modify numpy array in-place arr.fill(i) aii.dirty() # dirty the ArrayInterfaceImage because the data changed i = (i + 1) % 256 if i == 1 and 0: arr = numpy.ones_like(arr) # create a new array aii.view_new_array(arr) # switch ArrayInterfaceImage to view the new array
def play_npmovie(npmovie, delay=0, magnify=1, mode="uimg", frames=None, framerange=None, print_frames=False): w = window.Window(visible=False, resizable=True) arr = numpy.zeros([60, 60], dtype=numpy.uint8) aii = ArrayInterfaceImage(arr) img = aii.texture w.width = img.width w.height = img.height w.set_visible() checks = image.create(32, 32, image.CheckerImagePattern()) background = image.TileableTexture.create_for_image(checks) glEnable(GL_BLEND) glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) if frames is None: if framerange is not None: start = framerange[0] stop = framerange[1] if stop == -1: stop = len(npmovie.uframes) frames = np.arange(start, stop) else: frames = np.arange(1, len(npmovie.uframes)) for f in frames: uframe = npmovie.uframes[f] if uframe.uimg is not None: try: if mode == "uimg": arr = uframe.uimg if mode == "legs": arr = uframe.legs if mode == "body": arr = uframe.body if mode == "wings": arr = uframe.wings if mode == "absdiff": arr = uframe.absdiff if mode == "wingimg2": arr = uframe.wingimg2 if mode == "wingimgR": arr = uframe.wingimgR if mode == "wingimgL": arr = uframe.wingimgL if mode == "wingimg": arr = uframe.wingimg if mode == "flysegs": arr = uframe.flysegs if mode == "diffthresh": arr = uframe.diffthresh if mode == "full": arr = npmovie.background arr[uframe.indices[0] : uframe.indices[1], uframe.indices[2] : uframe.indices[3]] = uframe.uimg except: arr = None if arr is not None: if arr.dtype != np.uint8: "converting" arr = np.array(arr, dtype=np.uint8) * 255 if magnify != 1: newshape = [arr.shape[0] * magnify, arr.shape[1] * magnify] arr = nim.rebin(arr, newshape) try: aii.view_new_array(arr) except: # size changed w.width = arr.shape[1] w.height = arr.shape[0] aii = ArrayInterfaceImage(arr) img = aii.texture w.dispatch_events() background.blit_tiled(0, 0, 0, w.width, w.height) img.blit(0, 0, 0) # add some overlays: r = arr.shape[0] / 2.0 body_axis = npmovie.kalmanobj.long_axis[f] if 0: wing_axis = npmovie.kalmanobj.wingaxisR[f] wing_center = npmovie.kalmanobj.wingcenterR[f] # print wing_center, wing_axis if mode == "wingimgR": print f, uframe.wingimgR.sum() pyglet.graphics.draw( 2, pyglet.gl.GL_LINES, ( "v2i", ( int(r), int(r), int(body_axis[1] * 10 * magnify) + int(r), int(body_axis[0] * 10 * magnify) + int(r), ), ), ) try: pyglet.graphics.draw( 2, pyglet.gl.GL_LINES, ("v2i", (int(r), int(r), int(wing_center[1] * magnify), int(wing_center[0] * magnify))), ) pyglet.graphics.draw( 1, pyglet.gl.GL_POINTS, ("v2i", (int(wing_center[1] * magnify), int(wing_center[0] * magnify))), ) pass except: pass w.flip() time.sleep(delay) # slow down the playback w.close()
def get_pixel_stats(filenames,showFrames=0,ROI=None): """get pixel stats arguments: filename list of .fmf movie files or single .fmf movie file showFrames 0 [default] or 1 ROI 4-tuple of region of interest (top, bottom, left, right) or None (whole frame) """ if isinstance(filenames,str): filenames = [filenames] if ROI is not None: top, bottom, left, right = ROI else: top, bottom, left, right = (1,0,120,600) #top, bottom, left, right = (1,0,0,1) FRAMESTEP = 1000 pixStats = [] lenOutStr = 0 for f,filename in enumerate(filenames): if filename[-3:] == 'fmf': fmf = FMF.FlyMovie(filename) nFrames = fmf.get_n_frames() frame,timestamp = fmf.get_frame(0) ROIFrame = frame[bottom:,left:right] ## mask to eliminate points in corner -> 'ring' mask height,width = ROIFrame.shape R = numpy.floor(height/2) x0,y0 = R,R if numpy.mod(x0,2)==0: x0,y0 = x0-.5,y0-.5 x = numpy.matrix(range(width)) y = numpy.transpose(numpy.matrix(range(height))) xx = numpy.array((0*y+1)*x - y0) yy = numpy.array(y*(0*x+1) - x0) radius = numpy.sqrt(xx**2 + yy**2) ring = (radius<R)& (radius>R/5) ## end mask stuff if showFrames: dispFrame = convert(ROIFrame,fmf.format) wnd = window.Window(visible=False, resizable=True) aii = ArrayInterfaceImage(dispFrame) img = aii.texture wnd.width = img.width wnd.height = img.height wnd.set_caption(filename[-23:]) wnd.set_visible() for frameNumber in range(nFrames): frame,timestamp = fmf.get_frame(frameNumber) ROIFrame = frame[bottom:,left:right] #invertedFrame = 255 - ROIFrame #invertedFrame = invertedFrame - 120 pixM = numpy.mean(ROIFrame[ring]) pixS = numpy.std(ROIFrame[ring]) if numpy.mod(frameNumber,FRAMESTEP) == 0: outStr = str(frameNumber)+' of '+ str(nFrames) sys.stdout.write("%s%s\r" % (outStr, " "*lenOutStr )) lenOutStr = len(outStr) sys.stdout.flush() if showFrames: if wnd.has_exit: break wnd.dispatch_events() dispFrame = convert(ROIFrame,fmf.format) dispFrame[~ring]=255 aii.view_new_array(dispFrame) img.blit(0, 0, 0) wnd.flip() pixStats.append((pixM,pixS,timestamp)) if showFrames: wnd.close() pixelStats = numpy.rec.fromarrays(numpy.transpose(pixStats), [('m',numpy.float),('s',numpy.float),('t',numpy.float)]) if showFrames: pylab.figure() pylab.plot(pixelStats.t,pixelStats.m) pylab.hold('on') pylab.plot(pixelStats.t,pixelStats.s) pylab.draw() return pixelStats