OpenCV Python – Matching the key points of two images using ORB and BFmatcher
In today’s digital era, image processing has become one of the most important and unique ways to communicate. Images could be processed using open-source computer vision libraries, like OpenCV. In this article, we will learn how to match the key points of two images using OpenCV Python, particularly by utilizing ORB and BFmatcher.
Introduction
Image matching is a crucial aspect of computer vision. It involves finding the correspondence between different points/features present in different images. The features are nothing but characteristic properties of an image that are invariant to changes in scale, rotation, and illumination. Finding a match between these features in two separate images can be a complex task.
In this article, we will explore how to conduct image matching using the OpenCV Python library. More specifically, we will use the ORB feature detector and descriptor extractor to find key features in our input images and then match these points using the Brute-Force Matcher.
The ORB Algorithm
The ORB (Oriented FAST and Rotated BRIEF) algorithm is a type of feature detector and descriptor. The process begins by detecting the corners in the image using the FAST algorithm. The feature descriptor is then computed using a binary descriptor based on the BRIEF algorithm.
The benefit of ORB is its speed and rotational invariance feature that distinguishes it from other algorithms. Usually, the speed of feature detectors comes at the cost of a reduction in quality where the faster feature detectors such as FAST and the more accurate feature detectors such as SIFT are usually time-consuming.
Here is an example of detecting the features and descriptors from input images using ORB:
# Import relevant libraries
import cv2
import numpy as np
# Read input images
img1 = cv2.imread("image1.jpg")
img2 = cv2.imread("image2.jpg")
# Convert images into grayscale
gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
# Initiate ORB detector
orb = cv2.ORB_create()
# Detect keypoints
kp1, des1 = orb.detectAndCompute(gray1, None)
kp2, des2 = orb.detectAndCompute(gray2, None)
The cv2.imread() function reads the input images. Then we convert them into grayscale as the ORB uses a grayscale image to process. We then define the ORB detector and apply it to both images using the detectAndCompute() function. This function detects and computes the key points and descriptors concurrently.
The Brute-Force Matching Algorithm
The Brute-Force Matcher is a basic matching algorithm that compares every descriptor in one image with all of the descriptors in another image. Brute-Force Matching is not an efficient algorithm, but it is simple and useful for understanding the fundamental concepts of image matching.
Here’s how to perform the matching and rendering with the Brute-Force Matcher:
# Create BFMatcher object
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
# Match descriptors
matches = bf.match(des1, des2)
# Sort them in the order of their distance
matches = sorted(matches, key=lambda x: x.distance)
# Drawing the matches using the 'match' function from OpenCV
img3 = cv2.drawMatches(img1, kp1, img2, kp2, matches[:40], None, flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)
# Show the result
cv2.imshow("Matching Result", img3)
cv2.waitKey(0)
cv2.destroyAllWindows()
In the above code, the BFMatcher object sets the matching parameter, and we match the key feature descriptors. Afterward, we sort them in the order of their Euclidean distance. In the cv2.drawMatches() function, we specify the input images and the first 40 matches to draw as a result. The rest of the lines refer to displaying the result.
Conclusion
Matching images in OpenCV Python using ORB and BFMatcher could be a fascinating task. This article has explored the basics of these algorithms and provided a code example that demonstrates their use.
We hope that you have an enhanced understanding of how to match the key points in two images using OpenCV Python and its algorithms. We encourage you to explore more methods and ideas to ensure optimum results.