অধ্যায়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)
প্র্যাকটিস টাস্ক
  1. নিজের বইয়ের cover একটি shelf photo-তে detect করে box আঁকুন (homography)।
  2. ৩টি overlapping photo দিয়ে panorama তৈরি করুন।
  3. একই 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-র উপর।