Beispiel #1
0
def doit(device_num=0,
         mode_num=None,
         num_buffers=30,
         save=False,
         max_frames=None,
         trigger_mode=None,
         roi=None,
         ):
    num_modes = cam_iface.get_num_modes(device_num)
    for this_mode_num in range(num_modes):
        mode_str = cam_iface.get_mode_string(device_num,this_mode_num)
        print 'mode %d: %s'%(this_mode_num,mode_str)
        if mode_num is None:
            if 'DC1394_VIDEO_MODE_FORMAT7_0' in mode_str and 'MONO8' in mode_str:
                mode_num=this_mode_num
    
    if mode_num is None:
        mode_num=0
    print 'choosing mode %d'%(mode_num,)

    cam = cam_iface.Camera(device_num,num_buffers,mode_num)

    if save:
        format = cam.get_pixel_coding()
        depth = cam.get_pixel_depth()
        filename = time.strftime( 'simple%Y%m%d_%H%M%S.fmf' )
        fly_movie = FlyMovieFormat.FlyMovieSaver(filename,
                                                 version=3,
                                                 format=format,
                                                 bits_per_pixel=depth,
                                                 )
        save_queue = Queue.Queue()
        save_thread = threading.Thread( target=save_func, args=(fly_movie,save_queue))
        save_thread.setDaemon(True)
        save_thread.start()

    num_props = cam.get_num_camera_properties()
    #for i in range(num_props):
    #    print "property %d: %s"%(i,str(cam.get_camera_property_info(i)))

    n_trigger_modes = cam.get_num_trigger_modes()
    print "Trigger modes:"
    for i in range(n_trigger_modes):
        print ' %d: %s'%(i,cam.get_trigger_mode_string(i))
    if trigger_mode is not None:
        cam.set_trigger_mode_number( trigger_mode )
    print 'Using trigger mode %d'%(cam.get_trigger_mode_number())

    cam.start_camera()
    if roi is not None:
        cam.set_frame_roi( *roi )
        actual_roi = cam.get_frame_roi()
        if roi != actual_roi:
            raise ValueError("could not set ROI. Actual ROI is %s."%(actual_roi,))
    frametick = 0
    framecount = 0
    last_fps_print = time.time()
    last_fno = None
    while 1:
        try:
            buf = nx.asarray(cam.grab_next_frame_blocking())
        except cam_iface.FrameDataMissing:
            sys.stdout.write('M')
            sys.stdout.flush()
            continue
        except cam_iface.FrameSystemCallInterruption:
            sys.stdout.write('I')
            sys.stdout.flush()
            continue

        timestamp = cam.get_last_timestamp()

        fno = cam.get_last_framenumber()
        if last_fno is not None:
            skip = (fno-last_fno)-1
            if skip != 0:
                print 'WARNING: skipped %d frames'%skip
    ##    if frametick==50:
    ##        print 'sleeping'
    ##        time.sleep(10.0)
    ##        print 'wake'
        last_fno=fno
        now = time.time()
        sys.stdout.write('.')
        sys.stdout.flush()
        frametick += 1
        framecount += 1

        t_diff = now-last_fps_print
        if t_diff > 5.0:
            fps = frametick/t_diff
            print "%.1f fps"%fps
            last_fps_print = now
            frametick = 0

        if save:
            save_queue.put( (buf,timestamp) )

        if max_frames:
            if framecount >= max_frames:
                break
Beispiel #2
0
    def __init__(self, device_num=0, mode_num=None,
                 num_buffers=30, trigger_mode=None, roi=None, max_framerate=None,
                 prop_config={}):
        """class for interfacing cam_iface cameras.

        Args:
          device_num (int, optional): cam_iface device number. Defaults to 0.
          mode_num (int, optional): camera mode number.
          num_buffers (int, optional): image buffer length for camera.
            Defaults to 30.
          trigger_mode (int, optional): trigger mode number.
          roi ((int, int), optional): region of interest. Defaults to full
            image.

        """
        super(CamifaceCapture, self).__init__()

        logger.info('initializing camera %d', device_num)
        # print all available camera modes on init.
        num_modes = cam_iface.get_num_modes(device_num)
        for this_mode_num in range(num_modes):
            mode_str = cam_iface.get_mode_string(device_num, this_mode_num)
            logger.info('video mode %d: %s', this_mode_num, mode_str)
            if mode_num is None:
                if 'DC1394_VIDEO_MODE_FORMAT7_0' in mode_str and 'MONO8' in mode_str:
                    mode_num = this_mode_num
        logger.info('using video mode %d', mode_num if mode_num is not None else 0)

        # initialize cam_iface.Camera instance.
        self._cam = cam_iface.Camera(device_num, num_buffers, mode_num)

        # print all available trigger modes.
        n_trigger_modes = self._cam.get_num_trigger_modes()
        for i in range(n_trigger_modes):
            logger.info('trigger mode %d: %s', i, self._cam.get_trigger_mode_string(i))
        if trigger_mode is not None:
            self._cam.set_trigger_mode_number(trigger_mode)
        logger.info('using trigger mode %d', self._cam.get_trigger_mode_number())

        # start the camera and set roi if requested.
        self._cam.start_camera()
        if roi is not None:
            self._cam.set_frame_roi(*roi)
            actual_roi = self._cam.get_frame_roi()
            if roi == actual_roi:
                self.frame_width, self.frame_height = roi
            else:
                raise ValueError("could not set ROI. Actual ROI is %s." % (actual_roi,))
        else:
            self.frame_width = self._cam.get_max_width()
            self.frame_height = self._cam.get_max_height()

        # set the properties
        for prop_num in range(self._cam.get_num_camera_properties()):
            prop_info = self._cam.get_camera_property_info(prop_num)
            _name = prop_info['name']
            if _name in prop_config:
                _val = prop_config[_name]
                if _val < 0 and prop_info['has_auto_mode']:
                    _auto = True
                else:
                    _auto = False
                self._cam.set_camera_property(prop_num, _val, _auto)
                _auto = 'AUTO' if _auto else 'MANUAL'
                logger.info("setting %s to: %f, %s", _name, _val, _auto)
            else:
                _val, _auto = self._cam.get_camera_property(prop_num)
                _auto = 'AUTO' if _auto else 'MANUAL'
                logger.info("leaving %s at: %f, %s", _name, _val, _auto)

        # set the max framerate
        if max_framerate is not None:
            self._cam.set_framerate(max_framerate)
            logger.info("setting max framerate to: %f", max_framerate)
        else:
            fr = self._cam.get_framerate()
            logger.info("leaving max framerate at: %f", fr)


        # set errors which can be ignored by the microfview mainloop
        self.noncritical_errors = (cam_iface.FrameDataMissing,
                                   cam_iface.FrameSystemCallInterruption)


        #properties expected by the CaptureBase class
        self.fps = self._cam.get_framerate()
        self.is_video_file = False