def scene_features(self, feat, maxmem, i1, i2): try: ref_img, depth = self.render_scene(i1, i2) except InvalidSceneException: return None # get keypoints and descriptors ref_kp, ref_desc, self._latest_detector = KeypointAlgo.detect_features(ref_img, feat, maxmem=maxmem, max_feats=self.MAX_FEATURES, for_ref=True) # save only 2d image coordinates, scrap scale, orientation etc ref_kp_2d = np.array([p.pt for p in ref_kp], dtype='float32') # get 3d coordinates ref_kp_3d = KeypointAlgo.inverse_project(self.system_model, ref_kp_2d, depth, self.render_z, self._ref_img_sc) if False: mm_dist = self.system_model.min_med_distance if False: pos = (0, 0, -mm_dist) qfin = tools.ypr_to_q(sc_ast_lat, 0, sc_ast_lon) light_v = tools.spherical2cartesian(light_lat, light_lon, 1) reimg = self.render_engine.render(self.obj_idx, pos, qfin, light_v) reimg = cv2.cvtColor(reimg, cv2.COLOR_RGB2GRAY) img = np.concatenate((cv2.resize(ref_img, (self.system_model.view_width, self.system_model.view_height)), reimg), axis=1) else: ref_kp = [cv2.KeyPoint(*self._cam.calc_img_xy(x, -y, -z-mm_dist), 1) for x, y, z in ref_kp_3d] img = cv2.drawKeypoints(ref_img, ref_kp, ref_img.copy(), (0, 0, 255), flags=cv2.DRAW_MATCHES_FLAGS_DEFAULT) cv2.imshow('res', img) cv2.waitKey() return np.array(ref_desc), ref_kp_2d, ref_kp_3d
elif method == 'all': feats = { KeypointAlgo.SIFT: 'sift', KeypointAlgo.SURF: 'surf', KeypointAlgo.ORB: 'orb', KeypointAlgo.AKAZE: 'akaze', } sm = RosettaSystemModel() re = RenderEngine(sm.cam.width, sm.cam.height) obj_idx = re.load_object(sm.asteroid.target_model_file) d = KeypointAlgo(sm, re, obj_idx) for feat, method in feats.items(): if False: kp, desc, detector = d.detect_features(img, feat, 0, nfeats=100) out = cv2.drawKeypoints( img, kp, img.copy(), (0, 0, 255), flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) else: d.FEATURE_FILTERING_RELATIVE_GRID_SIZE = 0.01 d.FEATURE_FILTERING_FALLBACK_GRID_SIZE = 2 ee = 0 if len(sys.argv) <= 3 or sys.argv[3] == '2': d.FEATURE_FILTERING_SCHEME = d.FFS_SIMPLE_GRID ee = sm.pixel_extent(abs(sm.min_med_distance)) elif sys.argv[3] == '1': d.FEATURE_FILTERING_SCHEME = d.FFS_SIMPLE_GRID else: