Example #1
0
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]
Example #2
0
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]
Example #3
0
 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
     }
Example #4
0
 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
     }
Example #5
0
 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
     }
Example #6
0
 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
     }