def match_thumbs(img, cache, thumb_size = (400, 400)) : # Load target and find descriptors and size target = get_thumbnail(img, thumb_size) t_orig_size = get_size(img) get_features(target) t_keypoints, t_descriptors = get_features(target) # Similar for query q_descriptors = cache.thumb["descriptors"] q_distances = cache.thumb["distances"] q_pos = cache.thumb["positions"] # match thumbnails and find ratio matcher = cv2.BFMatcher(cv2.NORM_L2, crossCheck=True) matches = [m for m in matcher.knnMatch(q_descriptors, t_descriptors, k=1) if len(m) > 0] ratios = numpy.array([m[0].distance / q_distances[m[0].queryIdx] for m in matches]) # Get positions of points and their scaling factor t_pos = [t_keypoints[m[0].trainIdx].pt for m in matches] t_ratio_x = t_orig_size[0]/float(target.shape[1]) t_ratio_y = t_orig_size[1]/float(target.shape[0]) t_ratio = numpy.array([t_ratio_x, t_ratio_y]) q_pos = numpy.array([cache.thumb["positions"][m[0].queryIdx] for m in matches]) q_ratio_x = cache.original["size"][0]/float(cache.thumb["size"][0]) q_ratio_y = cache.original["size"][1]/float(cache.thumb["size"][1]) q_ratio = numpy.array([q_ratio_x, q_ratio_y]) # Sort ratios and scale positions indices = numpy.argsort(ratios) pos_scaled = numpy.array([(q_p * q_ratio, t_p * t_ratio) for q_p, t_p in zip(q_pos, t_pos)]) return pos_scaled[indices], ratios[indices]
def match_thumbs(img, cache, thumb_size=(400, 400)): # Load target and find descriptors and size target = get_thumbnail(img, thumb_size) t_orig_size = get_size(img) get_features(target) t_keypoints, t_descriptors = get_features(target) # Similar for query q_descriptors = cache.thumb["descriptors"] q_distances = cache.thumb["distances"] q_pos = cache.thumb["positions"] # match thumbnails and find ratio matcher = cv2.BFMatcher(cv2.NORM_L2, crossCheck=True) matches = [ m for m in matcher.knnMatch(q_descriptors, t_descriptors, k=1) if len(m) > 0 ] ratios = numpy.array( [m[0].distance / q_distances[m[0].queryIdx] for m in matches]) # Get positions of points and their scaling factor t_pos = [t_keypoints[m[0].trainIdx].pt for m in matches] t_ratio_x = t_orig_size[0] / float(target.shape[1]) t_ratio_y = t_orig_size[1] / float(target.shape[0]) t_ratio = numpy.array([t_ratio_x, t_ratio_y]) q_pos = numpy.array( [cache.thumb["positions"][m[0].queryIdx] for m in matches]) q_ratio_x = cache.original["size"][0] / float(cache.thumb["size"][0]) q_ratio_y = cache.original["size"][1] / float(cache.thumb["size"][1]) q_ratio = numpy.array([q_ratio_x, q_ratio_y]) # Sort ratios and scale positions indices = numpy.argsort(ratios) pos_scaled = numpy.array([(q_p * q_ratio, t_p * t_ratio) for q_p, t_p in zip(q_pos, t_pos)]) return pos_scaled[indices], ratios[indices]
def create_thumbnail(self, path, max_size): """ Get relevant data for thumbnail """ # Create thumbnail thumbnail = imaging.get_thumbnail(path, max_size) # Get thumbnail features keypoints, descriptors = matchutil.get_features(thumbnail) # Get nearest neighbor within image (vector with touples of feature points and distances) matches = matchutil.bf_match(descriptors, descriptors, k=2) # Distances to nearest neighbor and positions nn_distances = [r[1].distance for r in matches] positions = [k.pt for k in keypoints] # Collect data self.thumb = { "descriptors": descriptors, "positions": positions, "distances": nn_distances, "size": thumbnail.shape }
def create_thumbnail(self, path, max_size) : """ Get relevant data for thumbnail """ # Create thumbnail thumbnail = imaging.get_thumbnail(path, max_size) # Get thumbnail features keypoints, descriptors = matchutil.get_features(thumbnail) # Get nearest neighbor within image (vector with touples of feature points and distances) matches = matchutil.bf_match(descriptors, descriptors, k = 2) # Distances to nearest neighbor and positions nn_distances = [r[1].distance for r in matches] positions = [k.pt for k in keypoints] # Collect data self.thumb = { "descriptors" : descriptors, "positions" : positions, "distances" : nn_distances, "size" : thumbnail.shape }
def create_image(self, path, max_size, metric): """ Match an image with itself finding the closest neighbors within that image """ # Open image img_data = imaging.open_img(path, max_size) # Get descriptors keypoints, descriptors = matchutil.get_features(img_data) # Match matches = matchutil.flann_match(descriptors, descriptors, k=2) # Distances and positions distances = numpy.array([r[1].distance for r in matches]) positions = numpy.array([k.pt for k in keypoints]) # build position_tree position_tree = BallTree(positions, metric=metric) # Collect data self.original = { "descriptors": descriptors, "positions": positions, "distances": distances, "position_tree": position_tree, "size": img_data.shape }
def create_image(self, path, max_size, metric) : """ Match an image with itself finding the closest neighbors within that image """ # Open image img_data = imaging.open_img(path, max_size) # Get descriptors keypoints, descriptors = matchutil.get_features(img_data) # Match matches = matchutil.flann_match(descriptors, descriptors, k=2) # Distances and positions distances = numpy.array([r[1].distance for r in matches]) positions = numpy.array([k.pt for k in keypoints]) # build position_tree position_tree = BallTree(positions, metric = metric) # Collect data self.original = { "descriptors" : descriptors, "positions" : positions, "distances" : distances, "position_tree" : position_tree, "size" : img_data.shape }