首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

影像特徵偵測實戰(三):SIFT 偵測器完整實作與效能比較

     編輯:關於.NET

SiftDetector 類別完整實作

本文提供基於 VLFeat 函式庫的 SiftDetector 完整 C# 封裝,支援三種偵測層級:Basic(僅關鍵點)、Normal(含方向)、Extended(含方向與 128 維描述子)。核心流程包含:

  1. 建構函式初始化 vl_sift_new,設定影像寬高、金字塔層數(noctaves)、每層間隔(nlevels)、最小八度索引(o_min)。
  2. Process 方法依序呼叫 vl_sift_process_first_octave 進入首層,再以 vl_sift_process_next_octave 迭代後續層級。
  3. 每層呼叫 vl_sift_detect 取得關鍵點,透過 VlSiftFilt.keys 指標遍歷。
  4. 視需求呼叫 vl_sift_calc_keypoint_orientations 計算主方向(最多 4 個),若為 Extended 模式再對每個方向呼叫 vl_sift_calc_keypoint_descriptor 產生 128 維浮點數描述子。
  5. 結果封裝為 SiftFeature 結構(含 VlSiftKeypoint 與 SiftKeyPointOrientation[]),回傳 List<SiftFeature>。
  6. 實作 IDisposable,於 Dispose 中呼叫 vl_sift_delete 釋放非受控資源。
public class SiftDetector : IDisposable
{
    private IntPtr ptrSiftFilt;
    // ... 建構函式、屬性、Process 多載、Dispose 實作 ...
}

public struct SiftFeature
{
    public VlSiftKeypoint keypoint;
    public SiftKeyPointOrientation[] keypointOrientations;
}

public struct SiftKeyPointOrientation
{
    public double angle;
    public float[] descriptors;
}

public enum SiftDetectorResultType { Basic, Normal, Extended }

MSER 區域偵測

OpenCV 的 cvExtractMSER 及 EmguCV 的 Image<TColor,TDepth>.ExtractMSER 實作最大穩定極值區域(MSER)偵測。結果為各區域所有像素點的序列(如矩形區域會依順時針回傳頂點)。範例程式展示參數設定(delta、maxArea、minArea 等)、計時、繪製多邊形與詳細頂點輸出。

Seq<Point>[] regions = imageSource.ExtractMSER(null, ref mserParam, storage);
foreach (Seq<Point> region in regions)
    imageResult.DrawPolyline(region.ToArray(), true, new Bgr(255,0,0), 2);

各類特徵偵測效能比較(預設參數,583×301 影像)

特徵類型耗時(ms)特徵數
Sobel 算子5.99N/A
拉普拉斯算子3.13N/A
Canny 算子3.41N/A
霍夫線變換13.7110
霍夫圓變換78.080
Harris 角點9.42N/A
Shi-Tomasi 角點16.9818
亞像素級角點3.6318
SURF 角點266.27151
Star 關鍵點14.8356
FAST 角點31.30159
SIFT 角點287.5254
MSER 區域40.632

測試環境: AMD Athlon II X2 240、DDR3 4GB、GeForce 9500 GT、Windows 7。

效能比較圖表

下一篇將介紹如何追蹤本文提及的特徵點(角點)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved