close
使用 OpenCV 比較 SIFT、SURF 與 ORB 特徵檢測
本文展示如何利用 OpenCV 中的 SIFT、SURF 和 ORB 特徵檢測算法,檢測圖像中的特徵點並進行可視化比較。
程式碼範例與註解
# 匯入必要模組
import cv2
import numpy as np
# 加載圖像
image = cv2.imread('blox.jpg')
# 初始化特徵檢測算法
sift_feature = cv2.xfeatures2d.SIFT_create()
surf_feature = cv2.xfeatures2d.SURF_create()
orb_feature = cv2.ORB_create()
# 檢測特徵點
sift_kp = sift_feature.detect(image)
surf_kp = surf_feature.detect(image)
orb_kp = orb_feature.detect(image)
# 繪製特徵點
sift_out = cv2.drawKeypoints(image, sift_kp, None)
surf_out = cv2.drawKeypoints(image, surf_kp, None)
orb_out = cv2.drawKeypoints(image, orb_kp, None)
# 在圖像上添加標籤
font = cv2.FONT_HERSHEY_SIMPLEX
loc = (10, 40)
color = (0, 0, 255)
cv2.putText(image, 'origin', loc, font, 1, color, 2, cv2.LINE_AA)
cv2.putText(sift_out, 'sift', loc, font, 1, color, 2, cv2.LINE_AA)
cv2.putText(surf_out, 'surf', loc, font, 1, color, 2, cv2.LINE_AA)
cv2.putText(orb_out, 'orb', loc, font, 1, color, 2, cv2.LINE_AA)
# 合併圖像
image = cv2.vconcat([
cv2.hconcat([image, sift_out]),
cv2.hconcat([surf_out, orb_out])
])
# 顯示結果
cv2.imshow('image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
程式解析
- 圖像加載: 使用
cv2.imread
加載圖像檔案'blox.jpg'
。 - 特徵檢測算法初始化:
SIFT
(Scale-Invariant Feature Transform):對尺度與旋轉不變的特徵檢測。SURF
(Speeded-Up Robust Features):SIFT 的改進版,運行速度更快。ORB
(Oriented FAST and Rotated BRIEF):適合實時應用的特徵檢測算法。
- 特徵點檢測: 使用
detect
方法檢測圖像中的特徵點,分別對應 SIFT、SURF 和 ORB。 - 繪製特徵點: 使用
cv2.drawKeypoints
將檢測到的特徵點繪製在圖像上。 - 添加標籤: 利用
cv2.putText
在圖像上標記特徵檢測算法的名稱。 - 合併與顯示圖像: 使用
cv2.vconcat
和cv2.hconcat
合併多張圖像進行比較,並通過cv2.imshow
可視化結果。
結論
本程式展示了 SIFT、SURF 和 ORB 特徵檢測算法的應用與比較。用戶可以根據特定需求選擇合適的算法,例如 SIFT 與 SURF 適合精確特徵檢測,而 ORB 適用於實時場景。
全站熱搜