def compute_inliers_bearings(b1, b2, R, t, threshold=0.01): """Compute points that can be triangulated. Args: b1, b2: Bearings in the two images. R, t: Rotation and translation from the second image to the first. That is the convention and the opposite of many functions in this module. threshold: max reprojection error in radians. Returns: array: Aray of boolean indicating inliers/outliers """ p = pygeometry.triangulate_two_bearings_midpoint_many(b1, b2, R, t) good_idx = [i for i in range(len(p)) if p[i][0]] points = np.array([p[i][1] for i in range(len(p)) if p[i][0]]) br1 = points.copy() br1 /= np.linalg.norm(br1, axis=1)[:, np.newaxis] br2 = R.T.dot((points - t).T).T br2 /= np.linalg.norm(br2, axis=1)[:, np.newaxis] ok1 = np.linalg.norm(br1 - b1[good_idx], axis=1) < threshold ok2 = np.linalg.norm(br2 - b2[good_idx], axis=1) < threshold is_ok = ok1 * ok2 inliers = [False] * len(b1) for i, ok in enumerate(is_ok): inliers[good_idx[i]] = ok return inliers
def triangulation_reprojection_bearings(b1, b2, R, t): """Return two-views bearings reprojections given their relative pose.""" p = pygeometry.triangulate_two_bearings_midpoint_many(b1, b2, R, t) good_idx = [i for i in range(len(p)) if p[i][0]] points = np.array([p[i][1] for i in range(len(p)) if p[i][0]]) br1 = points.copy() br1 /= np.linalg.norm(br1, axis=1)[:, np.newaxis] br2 = R.T.dot((points - t).T).T br2 /= np.linalg.norm(br2, axis=1)[:, np.newaxis] return br1, br2, good_idx
def _compute_inliers_bearings(b1, b2, T, threshold=0.01): R = T[:, :3] t = T[:, 3] p = np.array(pygeometry.triangulate_two_bearings_midpoint_many(b1, b2, R, t)) br1 = p.copy() br1 /= np.linalg.norm(br1, axis=1)[:, np.newaxis] br2 = R.T.dot((p - t).T).T br2 /= np.linalg.norm(br2, axis=1)[:, np.newaxis] ok1 = multiview.vector_angle_many(br1, b1) < threshold ok2 = multiview.vector_angle_many(br2, b2) < threshold return ok1 * ok2
def _two_view_reconstruction_inliers(b1, b2, R, t, threshold): """Compute number of points that can be triangulated. Args: b1, b2: Bearings in the two images. R, t: Rotation and translation from the second image to the first. That is the convention and the opposite of many functions in this module. threshold: max reprojection error in radians. Returns: array: Inlier indices. """ p = np.array(pygeometry.triangulate_two_bearings_midpoint_many(b1, b2, R, t)) br1 = p.copy() br1 /= np.linalg.norm(br1, axis=1)[:, np.newaxis] br2 = R.T.dot((p - t).T).T br2 /= np.linalg.norm(br2, axis=1)[:, np.newaxis] ok1 = np.linalg.norm(br1 - b1, axis=1) < threshold ok2 = np.linalg.norm(br2 - b2, axis=1) < threshold return np.nonzero(ok1 * ok2)[0]