DigiHouse
日本語

TECH ARTICLE · NCU · 4 MIN READ

Blog / NCU

第 31 課|使用 OpenCV 比較 SIFT、SURF 與 ORB 特徵檢測

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

使用 OpenCV 比較 SIFT、SURF 與 ORB 特徵檢測

本文展示如何利用 OpenCV 中的 SIFT、SURF 和 ORB 特徵檢測算法,檢測圖像中的特徵點並進行可視化比較。

程式碼範例與註解

text
# 匯入必要模組
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 適用於實時場景。

劉老師的跨域創想工坊

本文亦刊載於 PIXNET

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