অধ্যায়Phase 3 · ক্লাসিক্যাল কম্পিউটার ভিশন
3.3 10 মিনিট পড়া
Feature Matching
BFMatcher, FLANN।
🎬 গল্প দিয়ে শুরু
দুটি ছবিতে একই object আছে কি না কীভাবে বলবেন? আগের অধ্যায়ে keypoint বের করলাম — এখন তাদের match করার পালা। Panorama stitching, AR, image search — সব এর উপর দাঁড়িয়ে।
Brute-Force Matcher
python
bf_match.py
import cv2
img1 = cv2.imread("book.jpg", cv2.IMREAD_GRAYSCALE)
img2 = cv2.imread("shelf.jpg", cv2.IMREAD_GRAYSCALE)
orb = cv2.ORB_create(1000)
kp1, d1 = orb.detectAndCompute(img1, None)
kp2, d2 = orb.detectAndCompute(img2, None)
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
matches = bf.match(d1, d2)
matches = sorted(matches, key=lambda m: m.distance)[:30]
out = cv2.drawMatches(img1, kp1, img2, kp2, matches, None,
flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)
cv2.imwrite("matches.jpg", out)Norm পছন্দ
SIFT →
NORM_L2; ORB/BRIEF → NORM_HAMMING (binary descriptor)।FLANN — fast approximate matcher
python
import cv2
sift = cv2.SIFT_create()
kp1, d1 = sift.detectAndCompute(img1, None)
kp2, d2 = sift.detectAndCompute(img2, None)
index_params = dict(algorithm=1, trees=5) # KDTree
search_params = dict(checks=50)
flann = cv2.FlannBasedMatcher(index_params, search_params)
matches = flann.knnMatch(d1, d2, k=2)
# Lowe's ratio test
good = [m for m,n in matches if m.distance < 0.75 * n.distance]Lowe's ratio test
প্রতিটি keypoint-এর জন্য top-2 match নিয়ে, প্রথমটি দ্বিতীয়টির ০.৭৫ গুণের চেয়ে কম দূরত্বে হলেই ভালো match। False match হাজার গুণ কমে।
Homography — দুই ছবি align করা
python
import cv2, numpy as np
if len(good) > 10:
src = np.float32([kp1[m.queryIdx].pt for m in good]).reshape(-1,1,2)
dst = np.float32([kp2[m.trainIdx].pt for m in good]).reshape(-1,1,2)
H, mask = cv2.findHomography(src, dst, cv2.RANSAC, 5.0)
h, w = img1.shape
corners = np.float32([[0,0],[0,h],[w,h],[w,0]]).reshape(-1,1,2)
projected = cv2.perspectiveTransform(corners, H)
img2_box = cv2.polylines(img2.copy(), [np.int32(projected)], True, 255, 3)RANSAC outlier match উপেক্ষা করে শুধু consistent point দিয়ে homography বের করে। Panorama stitching ও document scanner-এর মূল engine।
Application — Image Stitching (Panorama)
python
import cv2
imgs = [cv2.imread(p) for p in ["left.jpg","mid.jpg","right.jpg"]]
stitcher = cv2.Stitcher_create()
status, pano = stitcher.stitch(imgs)
if status == cv2.Stitcher_OK:
cv2.imwrite("panorama.jpg", pano) প্র্যাকটিস টাস্ক
- নিজের বইয়ের cover একটি shelf photo-তে detect করে box আঁকুন (homography)।
- ৩টি overlapping photo দিয়ে panorama তৈরি করুন।
- একই scene-এর rotated version-এ SIFT+FLANN+Lowe ratio দিয়ে good match count করুন।
সারসংক্ষেপ
- BFMatcher = সহজ, সব জোড়া try; FLANN = বড় dataset-এ দ্রুত।
- Lowe's ratio test false match dramatically কমায়।
- RANSAC + homography → reliable alignment, AR overlay, panorama।
- Match quality নির্ভর করে descriptor-এর quality-র উপর।