import numpy as np from ..util import img_as_float from .util import _mask_border_keypoints def descriptor_orb(image, keypoints, keypoints_angle): image = np.squeeze(image) if image.ndim != 2: raise ValueError("Only 2-D gray-scale images supported.") image = img_as_float(image) mask = _mask_border_keypoints(image, keypoints, 13) keypoints = keypoints[mask] keypoints_angle = keypoints_angle[mask] pos1 = binary_tests[:, :2] pos2 = binary_tests[:, 2:] descriptors = np.zeros((keypoints.shape[0], 256), dtype=bool) for i in range(keypoints.shape[0]): angle = keypoints_angle[i] a = np.sin(angle * np.pi / 180.) b = np.cos(angle * np.pi / 180.) rotation_matrix = [[b, a], [-a, b]] steered_pos1 = pos1 * rotation_matrix steered_pos2 = pos2 * rotation_matrix for j in range(256): pr1 = steered_pos1[j][0] pc1 = steered_pos1[j][1] pr2 = steered_pos2[j][0] pc2 = steered_pos2[j][1] descriptors[i, j] = (image[pr1, pc1] < image[pr2, pc2]) return descriptors # Learned 256 decision pairs for binary tests in rBRIEF. Taken from OpenCV. binary_tests = np.asarray([[8,-3, 9,5], [4,2, 7,-12], [-11,9, -8,2], [7,-12, 12,-13], [2,-13, 2,12], [1,-7, 1,6], [-2,-10, -2,-4], [-13,-13, -11,-8], [-13,-3, -12,-9], [10,4, 11,9], [-13,-8, -8,-9], [-11,7, -9,12], [7,7, 12,6], [-4,-5, -3,0], [-13,2, -12,-3], [-9,0, -7,5], [12,-6, 12,-1], [-3,6, -2,12], [-6,-13, -4,-8], [11,-13, 12,-8], [4,7, 5,1], [5,-3, 10,-3], [3,-7, 6,12], [-8,-7, -6,-2], [-2,11, -1,-10], [-13,12, -8,10], [-7,3, -5,-3], [-4,2, -3,7], [-10,-12, -6,11], [5,-12, 6,-7], [5,-6, 7,-1], [1,0, 4,-5], [9,11, 11,-13], [4,7, 4,12], [2,-1, 4,4], [-4,-12, -2,7], [-8,-5, -7,-10], [4,11, 9,12], [0,-8, 1,-13], [-13,-2, -8,2], [-3,-2, -2,3], [-6,9, -4,-9], [8,12, 10,7], [0,9, 1,3], [7,-5, 11,-10], [-13,-6, -11,0], [10,7, 12,1], [-6,-3, -6,12], [10,-9, 12,-4], [-13,8, -8,-12], [-13,0, -8,-4], [3,3, 7,8], [5,7, 10,-7], [-1,7, 1,-12], [3,-10, 5,6], [2,-4, 3,-10], [-13,0, -13,5], [-13,-7, -12,12], [-13,3, -11,8], [-7,12, -4,7], [6,-10, 12,8], [-9,-1, -7,-6], [-2,-5, 0,12], [-12,5, -7,5], [3,-10, 8,-13], [-7,-7, -4,5], [-3,-2, -1,-7], [2,9, 5,-11], [-11,-13, -5,-13], [-1,6, 0,-1], [5,-3, 5,2], [-4,-13, -4,12], [-9,-6, -9,6], [-12,-10, -8,-4], [10,2, 12,-3], [7,12, 12,12], [-7,-13, -6,5], [-4,9, -3,4], [7,-1, 12,2], [-7,6, -5,1], [-13,11, -12,5], [-3,7, -2,-6], [7,-8, 12,-7], [-13,-7, -11,-12], [1,-3, 12,12], [2,-6, 3,0], [-4,3, -2,-13], [-1,-13, 1,9], [7,1, 8,-6], [1,-1, 3,12], [9,1, 12,6], [-1,-9, -1,3], [-13,-13, -10,5], [7,7, 10,12], [12,-5, 12,9], [6,3, 7,11], [5,-13, 6,10], [2,-12, 2,3], [3,8, 4,-6], [2,6, 12,-13], [9,-12, 10,3], [-8,4, -7,9], [-11,12, -4,-6], [1,12, 2,-8], [6,-9, 7,-4], [2,3, 3,-2], [6,3, 11,0], [3,-3, 8,-8], [7,8, 9,3], [-11,-5, -6,-4], [-10,11, -5,10], [-5,-8, -3,12], [-10,5, -9,0], [8,-1, 12,-6], [4,-6, 6,-11], [-10,12, -8,7], [4,-2, 6,7], [-2,0, -2,12], [-5,-8, -5,2], [7,-6, 10,12], [-9,-13, -8,-8], [-5,-13, -5,-2], [8,-8, 9,-13], [-9,-11, -9,0], [1,-8, 1,-2], [7,-4, 9,1], [-2,1, -1,-4], [11,-6, 12,-11], [-12,-9, -6,4], [3,7, 7,12], [5,5, 10,8], [0,-4, 2,8], [-9,12, -5,-13], [0,7, 2,12], [-1,2, 1,7], [5,11, 7,-9], [3,5, 6,-8], [-13,-4, -8,9], [-5,9, -3,-3], [-4,-7, -3,-12], [6,5, 8,0], [-7,6, -6,12], [-13,6, -5,-2], [1,-10, 3,10], [4,1, 8,-4], [-2,-2, 2,-13], [2,-12, 12,12], [-2,-13, 0,-6], [4,1, 9,3], [-6,-10, -3,-5], [-3,-13, -1,1], [7,5, 12,-11], [4,-2, 5,-7], [-13,9, -9,-5], [7,1, 8,6], [7,-8, 7,6], [-7,-4, -7,1], [-8,11, -7,-8], [-13,6, -12,-8], [2,4, 3,9], [10,-5, 12,3], [-6,-5, -6,7], [8,-3, 9,-8], [2,-12, 2,8], [-11,-2, -10,3], [-12,-13, -7,-9], [-11,0, -10,-5], [5,-3, 11,8], [-2,-13, -1,12], [-1,-8, 0,9], [-13,-11, -12,-5], [-10,-2, -10,11], [-3,9, -2,-13], [2,-3, 3,2], [-9,-13, -4,0], [-4,6, -3,-10], [-4,12, -2,-7], [-6,-11, -4,9], [6,-3, 6,11], [-13,11, -5,5], [11,11, 12,6], [7,-5, 12,-2], [-1,12, 0,7], [-4,-8, -3,-2], [-7,1, -6,7], [-13,-12, -8,-13], [-7,-2, -6,-8], [-8,5, -6,-9], [-5,-1, -4,5], [-13,7, -8,10], [1,5, 5,-13], [1,0, 10,-13], [9,12, 10,-1], [5,-8, 10,-9], [-1,11, 1,-13], [-9,-3, -6,2], [-1,-10, 1,12], [-13,1, -8,-10], [8,-11, 10,-6], [2,-13, 3,-6], [7,-13, 12,-9], [-10,-10, -5,-7], [-10,-8, -8,-13], [4,-6, 8,5], [3,12, 8,-13], [-4,2, -3,-3], [5,-13, 10,-12], [4,-13, 5,-1], [-9,9, -4,3], [0,3, 3,-9], [-12,1, -6,1], [3,2, 4,-8], [-10,-10, -10,9], [8,-13, 12,12], [-8,-12, -6,-5], [2,2, 3,7], [10,6, 11,-8], [6,8, 8,-12], [-7,10, -6,5], [-3,-9, -3,9], [-1,-13, -1,5], [-3,-7, -3,4], [-8,-2, -8,3], [4,2, 12,12], [2,-5, 3,11], [6,-9, 11,-13], [3,-1, 7,12], [11,-1, 12,4], [-3,0, -3,6], [4,-11, 4,12], [2,-4, 2,1], [-10,-6, -8,1], [-13,7, -11,1], [-13,12, -11,-13], [6,0, 11,-13], [0,-1, 1,4], [-13,3, -9,-2], [-9,8, -6,-3], [-13,-6, -8,-2], [5,-9, 8,10], [2,7, 3,-9], [-1,-6, -1,-1], [9,5, 11,-2], [11,-3, 12,-8], [3,0, 3,5], [-1,4, 0,10], [3,-6, 4,5], [-13,0, -10,5], [5,8, 12,11], [8,9, 9,-6], [7,-4, 8,-12], [-10,4, -10,9], [7,3, 12,4], [9,-7, 10,-2], [7,0, 12,-2], [-1,-6, 0,-11]])