ZiadMansourM / photogrammetry

Photogrammetry: Close Range 3D scanning. Our graduation project 🎓
https://docs.scanmate.sreboy.com/
GNU General Public License v3.0
5 stars 0 forks source link

Filtering Feature Matches #33

Open MohamedWZS opened 1 year ago

MohamedWZS commented 1 year ago

can we use deep learning or an ai model to return only good matches?

Yes, deep learning and AI models can be used to improve feature matching by learning more discriminative feature descriptors or directly predicting good matches between images. There are several approaches to this:

Learning feature descriptors: You can use deep learning models to learn more discriminative feature descriptors that are robust to variations in viewpoint, lighting, and other challenges. One popular approach is to use convolutional neural networks (CNNs) to learn feature descriptors from image patches. Examples of such models include L2-Net, HardNet, and SuperPoint.

Learning to match features: Another approach is to use deep learning models to directly predict the correspondences between images. Some models learn to estimate the geometric transformation between images by predicting dense correspondences in a pixel-to-pixel manner (e.g., Spatial Transformer Networks) or by learning to match keypoints in a feature-to-feature manner (e.g., DeepMatching).

Learning to filter matches: You can also train a deep learning model to predict whether a given feature match is an inlier or an outlier based on the feature descriptors and their spatial relationships. This can be done by training a binary classifier, such as a deep neural network, to predict the match quality based on the input feature descriptors and their relative positions in the images.

To use deep learning for feature matching, you would need a labeled dataset containing pairs of images with known correspondences or ground truth geometric transformations. You can use this dataset to train and evaluate your deep learning model. Once the model is trained, you can use it to predict good matches for new image pairs.

Keep in mind that using deep learning models for feature matching can be more computationally expensive than traditional methods, such as SIFT, SURF, or ORB. However, deep learning models can provide more accurate and robust matches, especially for challenging image pairs with significant variations in viewpoint, lighting, or appearance.

MohamedWZS commented 1 year ago

can we use the match.distance to filter good matches from feature_matching output?

Yes, you can use the match.distance attribute to filter good matches from the output of the feature_matching function. One common approach is to set a distance threshold and keep only the matches with distances below the threshold. Another approach is to keep a fixed number of matches with the smallest distances.

Here's an example of how to filter matches based on a distance threshold:

def filter_matches_by_distance(matches, distance_threshold):
    good_matches = [match for match in matches if match.distance < distance_threshold]
    return good_matches

# Perform feature matching
matches = feature_matching(descriptors1, descriptors2)

# Filter matches based on distance threshold
distance_threshold = 250  # You can experiment with different threshold values
good_matches = filter_matches_by_distance(matches, distance_threshold)

Alternatively, you can keep a fixed number of matches with the smallest distances:

def keep_top_k_matches(matches, k):
    sorted_matches = sorted(matches, key=lambda x: x.distance)
    return sorted_matches[:k]

# Perform feature matching
matches = feature_matching(descriptors1, descriptors2)

# Keep the top k matches with the smallest distances
k = 100  # You can experiment with different values of k
top_k_matches = keep_top_k_matches(matches, k)

Both of these methods can be effective in filtering out poor matches. However, the ratio test, as described in a previous response, is usually more robust in removing false matches because it considers the relative difference between the best match and the second-best match, rather than an absolute distance threshold. You may want to experiment with different filtering methods and choose the one that works best for your specific problem and dataset.

MohamedWZS commented 1 year ago

what does cv2.DMatch object contain?

The cv2.DMatch object is a class in the OpenCV library used to represent a match between two feature points in a pair of images. It contains the following attributes:

queryIdx: This is an integer index of the feature point in the first (query) image's set of keypoints. It refers to the position of the feature point in the list of keypoints for the first image.

trainIdx: This is an integer index of the feature point in the second (train) image's set of keypoints. It refers to the position of the feature point in the list of keypoints for the second image.

imgIdx: This is an integer index of the train image. It is useful when you are dealing with multiple train images and want to identify which image the matched feature point belongs to. In a simple two-image matching scenario, this value is usually set to 0.

distance: This is a floating-point value representing the distance between the feature descriptor in the query image and the feature descriptor in the train image. The distance is a measure of similarity between the two descriptors. A smaller distance indicates a better match.

When using the cv2.DMatch object, you can access these attributes as follows:

match = cv2.DMatch(...)
query_idx = match.queryIdx
train_idx = match.trainIdx
img_idx = match.imgIdx
distance = match.distance

These attributes can be used to retrieve the matched keypoints and their corresponding feature descriptors for further processing, such as estimating a geometric transformation between the images or refining the matches.