def test_result_saves(self): # Make an image collection with some number of images images = [] image_builder = DemoImageBuilder(mode=ImageMode.MONOCULAR, width=160, height=120) num_images = 10 for time in range(num_images): image = image_builder.create_frame(time / num_images) image.save() images.append(image) image_collection = ImageCollection( images=images, timestamps=list(range(len(images))), sequence_type=ImageSequenceType.SEQUENTIAL ) image_collection.save() subject = LibVisOMonoSystem() subject.save() # Actually run the system using mocked images subject.set_camera_intrinsics(image_builder.get_camera_intrinsics(), 1 / 10) subject.start_trial(ImageSequenceType.SEQUENTIAL) for time, image in enumerate(images): subject.process_image(image, time) result = subject.finish_trial() self.assertIsInstance(result, SLAMTrialResult) self.assertEqual(len(image_collection), len(result.results)) result.image_source = image_collection result.save() # Load all the entities all_entities = list(SLAMTrialResult.objects.all()) self.assertGreaterEqual(len(all_entities), 1) self.assertEqual(all_entities[0], result) all_entities[0].delete() SLAMTrialResult._mongometa.collection.drop() ImageCollection._mongometa.collection.drop() Image._mongometa.collection.drop()
def test_can_run_on_colour_images(self): # Actually run the system using mocked images num_frames = 50 max_time = 50 speed = 0.1 image_builder = DemoImageBuilder( mode=ImageMode.MONOCULAR, width=640, height=480, num_stars=150, length=max_time * speed, speed=speed, close_ratio=0.6, min_size=1, max_size=50, colour=True ) subject = LibVisOMonoSystem(motion_threshold=1000) subject.set_camera_intrinsics(image_builder.get_camera_intrinsics(), max_time / num_frames) subject.start_trial(ImageSequenceType.SEQUENTIAL, seed=0) for idx in range(num_frames): time = max_time * idx / num_frames image = image_builder.create_frame(time) subject.process_image(image, time) result = subject.finish_trial() self.assertIsInstance(result, SLAMTrialResult) self.assertEqual(subject, result.system) self.assertTrue(result.success) self.assertFalse(result.has_scale) self.assertIsNotNone(result.run_time) self.assertEqual({ 'seed': 0, 'in_fx': image_builder.focal_length, 'in_fy': image_builder.focal_length, 'in_cu': image_builder.width / 2, 'in_cv': image_builder.height / 2, 'in_width': image_builder.width, 'in_height': image_builder.height }, result.settings) self.assertEqual(num_frames, len(result.results)) has_been_found = False has_been_lost = False for idx, frame_result in enumerate(result.results): self.assertEqual(max_time * idx / num_frames, frame_result.timestamp) self.assertIsNotNone(frame_result.pose) self.assertIsNotNone(frame_result.motion) # If we're lost, our tracking state should depend of if we've been lost before is_first_frame = False if frame_result.tracking_state != TrackingState.OK: if has_been_found: has_been_lost = True self.assertEqual(frame_result.tracking_state, TrackingState.LOST) else: self.assertEqual(frame_result.tracking_state, TrackingState.NOT_INITIALIZED) elif has_been_found is False: is_first_frame = True has_been_found = True # Motion should be none when we are lost, and on the first found frame if is_first_frame or frame_result.tracking_state != TrackingState.OK: self.assertIsNone(frame_result.estimated_motion) else: self.assertIsNotNone(frame_result.estimated_motion) # Estimates will be none until we get a successful estimate, or after it has lost if not has_been_found or has_been_lost: self.assertIsNone(frame_result.estimated_pose) else: self.assertIsNotNone(frame_result.estimated_pose) self.assertTrue(has_been_found)
def test_can_start_and_stop_trial(self): subject = LibVisOMonoSystem() subject.start_trial(ImageSequenceType.SEQUENTIAL) result = subject.finish_trial() self.assertIsInstance(result, SLAMTrialResult)