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.vconcatcv2.hconcat 合併多張圖像進行比較,並通過 cv2.imshow 可視化結果。

結論

本程式展示了 SIFT、SURF 和 ORB 特徵檢測算法的應用與比較。用戶可以根據特定需求選擇合適的算法,例如 SIFT 與 SURF 適合精確特徵檢測,而 ORB 適用於實時場景。

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 liusming 的頭像
    liusming

    劉老師的跨域創想工坊

    liusming 發表在 痞客邦 留言(0) 人氣()