DigiHouse
English

TECH ARTICLE · NCU · 3 MIN READ

Blog / NCU

第 33 課|使用 OpenCV ORB 特徵檢測與匹配

使用 OpenCV ORB 特徵檢測與匹配。本文已重新整理為適合 DigiHouse 閱讀的課程文章,並保留原始 PIXNET 刊載網址。

使用 OpenCV 的 ORB 特徵檢測與匹配

本文展示如何利用 OpenCV 的 ORB 特徵檢測器,對兩張圖像進行特徵匹配,並視覺化匹配結果。

程式碼範例與註解

text
# 匯入必要模組
import cv2

# 加載圖片
img1 = cv2.imread('box.png')
img2 = cv2.imread('box_in_scene.png')

# 初始化 ORB 特徵檢測器
orb = cv2.ORB_create()

# 檢測並計算特徵點與描述子
kp1, des1 = orb.detectAndCompute(img1, None)
kp2, des2 = orb.detectAndCompute(img2, None)

# 初始化 BFMatcher 並匹配特徵
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
matches = bf.match(des1, des2)

# 按距離排序匹配結果
matches = sorted(matches, key=lambda x: x.distance)

# 繪製前 10 個匹配點
img3 = cv2.drawMatches(
    img1, kp1,
    img2, kp2,
    matches[:10],
    outImg=None,
    flags=cv2.DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINTS
)

# 調整輸出圖像大小
width, height, channel = img3.shape
ratio = float(width) / float(height)
img3 = cv2.resize(img3, (1024, int(1024 * ratio)))

# 顯示匹配結果
cv2.imshow('image', img3)
cv2.waitKey(0)
cv2.destroyAllWindows()

程式解析

• 解析命令列參數: 使用 argparse 獲取兩張輸入圖片的路徑。

• 圖片加載: 使用 cv2.imread 讀取圖片數據。

• ORB 特徵檢測: ORB (Oriented FAST and Rotated BRIEF):一種高效的特徵檢測與描述算法,適合實時應用。

• 使用 orb.detectAndCompute 同時檢測特徵點並計算描述子。

• 特徵匹配: 使用 cv2.BFMatcher 進行特徵匹配,基於 Hamming 距離並啟用交叉檢查。

• 按距離對匹配結果排序,距離越小匹配越好。

• 繪製匹配結果: 使用 cv2.drawMatches 繪製前 10 個匹配點,方便視覺化檢查。

• 顯示結果: 使用 cv2.imshow 顯示匹配結果,按任意鍵退出視窗。

結論

本程式展示了如何使用 ORB 特徵檢測與 BFMatcher 匹配兩張圖片。ORB 是一種高效的特徵檢測算法,非常適合實時應用場景。用戶可以根據匹配結果進一步優化應用,例如圖像拼接或目標識別。

劉老師的跨域創想工坊

本文亦刊載於 PIXNET

https://liusming.pixnet.net/blog/posts/14222886561