def computeCornerResponse(img, radius, max_number_points, harris_threshold_rel): max_dimension = max([img.shape[0], img.shape[1]]) gray_img = toGrayScale(img) edge_discard = 20 harris_img, interest_points = harris.get_harris_corners( gray_img, edge_discard, harris_threshold_rel) num_points_found = len(interest_points[0]) interest_points_transposed = np.transpose(interest_points) dists = harris.dist2(interest_points_transposed, interest_points_transposed) max_global = float("-inf") max_global_index = None for index in xrange(num_points_found): y = interest_points[0][index] x = interest_points[1][index] if harris_img[y, x] > max_global: max_global_index = index max_global = harris_img[y, x] indexes_selected = [max_global_index] for r in reversed(xrange(radius, max_dimension)): for candidate_index in xrange(num_points_found): isGood = True for good_index in indexes_selected: if dists[candidate_index, good_index] < r * r: isGood = False break if isGood: indexes_selected.append(candidate_index) print "Found " + str(len(indexes_selected)) + " out of " + str( max_number_points) + " points expected." if len(indexes_selected) >= max_number_points: break if len(indexes_selected) >= max_number_points: break points = [] for index in indexes_selected: points.append((interest_points[1][index], interest_points[0][index])) print "Total points used: " + str(len(points)) figure, axis = plt.subplots(ncols=3) axis[0].imshow(img, vmin=0, vmax=1) axis[1].imshow(harris_img, vmin=0, vmax=1) axis[2].imshow(img, vmin=0, vmax=1) for x, y in points: marker = plt.Circle((x, y), 2, color='r') axis[2].add_artist(marker) plt.show() return points
def feature_match(desc_imA, desc_imB): results = {} for point_A, vector_A in desc_imA.items(): dists = {} for point_B, vector_B in desc_imB.items(): dists[point_B] = harris.dist2(vector_A, vector_B)[0][0] dists = sorted((value, key) for (key, value) in dists.items()) if dists[0][0] / dists[1][0] < .3: results[point_A] = dists[0][1] return results
def feature_match(desc_imA, desc_imB): threshold = .3 results = {} for point_A, vector_A in desc_imA.items(): dists = {} for point_B, vector_B in desc_imB.items(): dists[point_B] = harris.dist2(vector_A, vector_B)[0][0] dists = sorted((value, key) for (key, value) in dists.items()) best = dists[0] secondbest = dists[1] if best[0] / secondbest[0] < threshold: results[point_A] = best[1] return results
def computeCornerResponse(img, radius, max_number_points,harris_threshold_rel): max_dimension = max([img.shape[0],img.shape[1]]) gray_img = img edge_discard = EDGE_DISCARD harris_img, interest_points = harris.get_harris_corners(gray_img,edge_discard,harris_threshold_rel) num_points_found = len(interest_points[0]) interest_points_transposed = np.transpose(interest_points) dists = harris.dist2(interest_points_transposed,interest_points_transposed) max_global = float("-inf") max_global_index = None for index in xrange(num_points_found): y = interest_points[0][index] x = interest_points[1][index] if harris_img[y,x] > max_global: max_global_index = index max_global = harris_img[y,x] indexes_selected = [max_global_index] for r in reversed(xrange(radius,max_dimension)): for candidate_index in xrange(num_points_found): isGood = True for good_index in indexes_selected: if dists[candidate_index,good_index] < r*r: isGood = False break if isGood: indexes_selected.append(candidate_index) # print "Found " + str(len(indexes_selected)) + " out of " + str(max_number_points) + " points expected." if len(indexes_selected) >= max_number_points: break if len(indexes_selected) >= max_number_points: break points = [] for index in indexes_selected: points.append((interest_points[1][index],interest_points[0][index])) return points
def ANMS(points, eps, H): radius_values = {} for center in points: H_i = H[center[0], center[1]] interest_points = [] for point in points: H_j = H[point[0], point[1]] if H_i < (eps * H_j): interest_points.append(point) if len(interest_points) > 0: radius_values[center] = np.amin( harris.dist2(np.array([center]), np.array(interest_points))) radius_values = sorted( (value, key) for (key, value) in radius_values.items())[::-1] top_500 = [[], []] for i in range(500): top_500[0].append(radius_values[i][1][0]) top_500[1].append(radius_values[i][1][1]) return top_500
def ANMS(points, eps, H): remain_num = 500 radius = {} for center in points: rC, cC = center[0], center[1] interest_points = [] H_C = H[rC, cC] for point in points: H_p = H[point[0], point[1]] if H_C < (eps * H_p): interest_points.append(point) if len(interest_points) > 0: radius[center] = np.amin( harris.dist2(np.array([center]), np.array(interest_points))) radius_values = sorted(((value, key) for (key, value) in radius.items()), reverse=True) top_500 = [[], []] for i in range(remain_num): top_500[0].append(radius_values[i][1][0]) top_500[1].append(radius_values[i][1][1]) return top_500