Commit 01ccffa1 authored by Jay's avatar Jay Committed by jay
Browse files

FLANN based matcher class in place.

parent cdf2445a
Loading
Loading
Loading
Loading
+11 −47
Original line number Diff line number Diff line
import cv2
import numpy as np

import pandas as pd
from autocnet.graph.network import CandidateGraph

FLANN_INDEX_KDTREE = 1
@@ -26,7 +26,7 @@ class FlannMatcher(object):
    def __init__(self, flann_parameters=DEFAULT_FLANN_PARAMETERS):
        self._flann_matcher = cv2.FlannBasedMatcher(flann_parameters, {})
        self.image_indices = {}
        self.image_index_counter = 0  # OpenCv DMatch.imgIdx are one based
        self.image_index_counter = 0

    def add(self, descriptor, key):
        """
@@ -64,52 +64,16 @@ class FlannMatcher(object):

        Returns
        -------
         :
        matched : dataframe
                  containing matched points
        """
        print(self.image_indices)
        matches = self._flann_matcher.knnMatch(descriptor, k=k)
        print(dir(self._flann_matcher))
        print(matches)
        matched = []
        for m in matches:
            print(m[0].imgIdx, m[0].queryIdx, m[0].trainIdx)
            #print(self.image_indices[m[0].imgIdx])


def match_features(iterable, flann_parameters=DEFAULT_FLANN_PARAMETERS):
    """
    Iterate over all nodes in the graph, create a single KDTree,
    and then apply a FLANN matcher.

    Parameters
    ----------
    iterable : iterable
            An iterable of descriptors

    flann_parameters : dict
                       of parameters for the FLANN matcher


    Returns
    -------

    """
    flann_matcher = create_flann_matcher(iterable, flann_parameters)


def create_flann_matcher(iterable, flann_parameters):

    flann_matcher = cv2.FlannBasedMatcher(flann_parameters, {})

    try:
        if isinstance(iterable, CandidateGraph):
            training_descriptors = [i[1]['descriptors'] for i in iterable.nodes_iter(data=True)]
        elif isinstance(iterable[0], np.ndarray):
            training_descriptors = iterable
        else:
            raise(TypeError, 'Unsupported iterable passed to match_features')
    except TypeError:
        print('Object is not iterable')
            matched.append((self.image_indices[m[1].imgIdx],
                  m[1].queryIdx,
                  m[1].trainIdx,
                  m[1].distance))
        return pd.DataFrame(matched, columns=['matched_to', 'queryIdx',
                                              'trainIdx', 'distance'])
    flann_matcher.add(training_descriptors)
    flann_matcher.train()
    return flann_matcher
 No newline at end of file
+7 −5
Original line number Diff line number Diff line
@@ -23,7 +23,7 @@ class TestMatcher(unittest.TestCase):
        self.fd['AS15-M-0296_SML.png'] = sift.detectAndCompute(im1, None)
        self.fd['AS15-M-0297_SML.png'] = sift.detectAndCompute(im2, None)

    def test_flann_match(self):
    def test_flann_match_two_images(self):

        fmatcher = matcher.FlannMatcher()
        truth_image_indices = {}
@@ -37,11 +37,13 @@ class TestMatcher(unittest.TestCase):

        fmatcher.train()

        matches = fmatcher.query(self.fd['AS15-M-0296_SML.png'][1], k=2)
        #self.assertEqual(10, len(matches))
        #self.assertEqual(2, len(matches[0]))
        matched = fmatcher.query(self.fd['AS15-M-0296_SML.png'][1], k=2)
        self.assertEqual(10, len(matched))

        # Check that self neighbors are being omitted
        distance = matched['distance']
        self.assertFalse(distance[distance == 0].any())

        self.assertTrue(False)

    def tearDown(self):
        pass
 No newline at end of file