<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                ##特征提取算法SIFT與SURF 當嘗試在不同圖像之間進行特征匹配時,通常會遇到圖像的大小、方向等參數發生改變的問題,簡而言之,就是尺度變化的問題。每幅圖像在拍攝時與目標物體的距離是不同的,因此要識別的目標物體在圖像中自然會存在不同的尺寸。 因此,計算機視覺中引入尺度不變的特征,主要的思想是每個檢測到的特征點都伴隨對應的尺度因子。1999年David Lowe提出了著名的尺度不變特征檢測器SIFT(Scale Invariant Feature Transform)算法,它具有尺度,旋轉,仿射,視角,光照不變性。而加速魯棒特性特征SURF(Speeded Up Robust Features)算法是SIFT的高效變種。這兩個算法申請了專利保護,其專利的擁有者為英屬哥倫比亞大學。 關于SIFT和SURF的特征介紹,已經有很多的blog對其進行簡介了,見參考的blog。由于還沒有將2004年那篇原文精細看完,因此這里只能粗淺地分析兩種算法,并描述在OpenCV中如何實現這兩種算法的特征檢測。 **一、基本概念** 1.1 算法背景 尺度不變特征轉換SIFT是一種著名的計算機視覺的算法,主要用來檢測圖像中的局部特征,通過在圖像中尋找極值點特征,并提取出其這些特征點的位置、尺度和旋轉不變量等信息。? 其應用范圍包含物體辨識、機器人地圖感知與導航、影像縫合、3D模型建立、手勢辨識、影像追蹤和動作比對。 局部影像特征的描述與偵測可以幫助辨識物體,SIFT 特征是基于物體上的一些局部外觀的興趣點而與影像的大小和旋轉無關。對于光線、噪聲、些微視角改變的容忍度也相當高。基于這些特性,它們是高度顯著而且相對容易擷取,在母數龐大的特征數據庫中,很容易辨識物體而且鮮有誤認。使用 SIFT特征描述對于部分物體遮蔽的偵測率也相當高,甚至只需要3個以上的SIFT物體特征就足以計算出位置與方位。在現今的電腦硬件速度下和小型的特征數據庫條件下,辨識速度可接近即時運算。SIFT特征的信息量大,適合在海量數據庫中快速準確匹配。(來自百度百科的解釋) 1.2 SIFT算法的主要優點 1\. SIFT特征是圖像的局部特征,其對旋轉、尺度縮放、亮度變化保持不變性,對視角變化、仿射變換、噪聲也保持一定程度的穩定性;? 2\. 獨特性(Distinctiveness)好,信息量豐富,適用于在海量特征數據庫中進行快速、準確的匹配;? 3\. 多量性,即使少數的幾個物體也可以產生大量的SIFT特征向量;? 4\. 高速性,經優化的SIFT匹配算法甚至可以達到實時的要求;? 5\. 可擴展性,可以很方便的與其他形式的特征向量進行聯合。 1.3 SIFT算法的適用環境 目標的自身狀態、場景所處的環境和成像器材的成像特性等因素影響圖像配準/目標識別跟蹤的性能。而SIFT算法在一定程度上可解決: 1\. 目標的旋轉、縮放、平移(RST)? 2\. 圖像仿射/投影變換(視點viewpoint)? 3\. 光照影響(illumination)? 4\. 目標遮擋(occlusion)? 5\. 雜物場景(clutter)? 6\. 噪聲 SIFT算法的實質是在不同的尺度空間上查找關鍵點(特征點),并計算出關鍵點的方向。SIFT所查找到的關鍵點是一些十分突出,不會因光照,仿射變換和噪音等因素而變化的點,如角點、邊緣點、暗區的亮點及亮區的暗點等。 1.4 算法的基本步驟 Lowe將SIFT算法分解為如下四步: 1\. 尺度空間極值檢測:搜索所有尺度上的圖像位置。通過高斯微分函數來識別潛在的對于尺度和旋轉不變的興趣點。? 2\. 關鍵點定位:在每個候選的位置上,通過一個擬合精細的模型來確定位置和尺度。關鍵點的選擇依據于它們的穩定程度。? 3\. 方向確定:基于圖像局部的梯度方向,分配給每個關鍵點位置一個或多個方向。所有后面的對圖像數據的操作都相對于關鍵點的方向、尺度和位置進行變換,從而提供對于這些變換的不變性。? 4\. 特征點描述:在每個關鍵點周圍的鄰域內,在選定的尺度上測量圖像局部的梯度。這些梯度被變換成一種表示,這種表示允許比較大的局部形狀的變形和光照變化。 1.5 SIFT算法的缺點 SIFT算法十分強大,精度很高,Mikolajczyk和Schmid曾經針對不同的場景,對光照變化、圖像幾何變形、分辨率差異、旋轉、模糊和圖像壓縮等6種情況,就多種最具代表性的描述子(如SIFT,矩不變量,互相關等10種描述子)進行了實驗和性能比較,結果表明,在以上各種情況下,SIFT描述子的性能最好。但算法的高深同樣帶來了一些缺點,如: 1\. 實時性不高。? 2\. 有時特征點較少。? 3\. 對邊緣光滑或經過平滑的圖像無法準確提取特征點。 針對這些問題,一些改進算法應運而生,SURF就是廣為人知的其中一種算法。 2.1 SURF算法介紹 SURF算法是SIFT算法的高效變種,在滿足一定效果的情況下完成兩幅圖像中物體的匹配,并基本實現了實時處理。SURF也檢測空間域和尺度域上的局部極大值作為特征,但是使用的是Hessian行列式響應而不是Laplacian行列式。 SURF的實現如下,首先對每個像素計算Hessian矩陣以得到特征,該矩陣測量一個函數的局部曲率,定義如下: ![](https://box.kancloud.cn/2015-12-30_5683a75d6b747.jpg) 該矩陣的行列式給出曲率的強度,定義角點為具有較高局部曲率的像素點(即在多個方向都具有高曲率)。由于該函數是由二階導數組成,因此可以使用不同的![](https://box.kancloud.cn/2015-12-30_5683a75d84216.jpg)?尺度的Laplacian Gaussian核進行計算,因此Hessian變成了三個變量的函數。當Hessian的值同時在空間域和尺度域上均達到局部極大值時(需要運行3*3*3的非極大值抑制),可以認為找到了尺度不變的特征。 所有這些不同尺度的運算都很耗時,而SURF算法的目的是盡可能高效。因此會使用近似的高斯核,僅涉及少量整數加法,結構如下圖所示: ![](https://box.kancloud.cn/2015-12-30_5683a75d91895.jpg) 左側的核用于估計混合二階導數,右側的核則用于估算垂直方向的二階導數,而其旋轉版本則用于估計水平方向的二階導數。 一旦識別了局部極大值,每個特征點的精確位置可以通過空間域及尺度域上進行插值獲取,結果是一組具有亞像素精確度的特征點,以及一個對應的尺度值。 ![](https://box.kancloud.cn/2015-12-30_5683a75dabdbb.jpg) 2.2 性能比較 無需贅述,A comparison of SIFT, PCA-SIFT and SURF 一文給出了SIFT和SURF的性能比較,對原圖像進行尺度、旋轉、模糊、亮度變化、仿射變換等變化后,再與原圖像進行匹配,統計匹配的效果,源圖片來源于Graffiti dataset。 ![](https://box.kancloud.cn/2015-12-30_5683a75dc3bdc.jpg) 這里使用的開發平臺是Qt5.3.2+OpenCV2.4.9。SURF、SIFT特征在OpenCV中的實現均使用了cv::FeatureDetector接口,OpenCV中的opencv_nonfree模塊包含了SURF和SIFT的相關函數,因此在使用時注意添加相關的頭文件。在這里,特征點的計算基于浮點核,因此這兩種算法相比其他算法在空間和尺度檢測上更加精確,但相對耗時。 至于理論部分有待進一步學習。 **二、實現SIFT特征檢測算法** 直接在Qt中創建一個控制臺項目,在main函數中添加: ~~~ #include <QCoreApplication> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/features2d/features2d.hpp> #include <opencv2/nonfree/nonfree.hpp> #include <QDebug> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // 讀入圖像 cv::Mat image= cv::imread("c:/018.jpg",0); cv::namedWindow("Original Image"); cv::imshow("Original Image", image); // 特征點的向量 std::vector<cv::KeyPoint>keypoints; // 構造SIFT特征檢測器 cv::SiftFeatureDetector sift( 0.03, // 特征的閾值 10.); // 用于降低 // 檢測SIFT特征值 sift.detect(image,keypoints); cv::drawKeypoints(image, // 原始圖像 keypoints, // 特征點的向量 featureImage, // 生成圖像 cv::Scalar(255,255,255), // 特征點的顏色 cv::DrawMatchesFlags::DRAW_RICH_KEYPOINTS); // 標志位 cv::namedWindow("SIFT Features"); cv::imshow("SIFT Features",featureImage); return a.exec(); } ~~~ 效果如下,在函數cv::drawKeypoints中我們使用cv::DrawMatchesFlags::DRAW_RICH_KEYPOINTS作為標志位,這樣唉使用DRAW_RICH_KEYPOINTS之后每個關鍵點上圓圈的尺寸與特征的尺度成正比: ![](https://box.kancloud.cn/2015-12-30_5683a75dd84f7.jpg) **三、實現SURF特征檢測算法** ~~~ #include <QCoreApplication> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/features2d/features2d.hpp> #include <opencv2/nonfree/nonfree.hpp> #include <QDebug> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // 讀入圖像 cv::Mat image= cv::imread("c:/018.jpg",0); cv::namedWindow("Original Image"); cv::imshow("Original Image", image); // 特征點的向量 std::vector<cv::KeyPoint>keypoints; // 構造SURF特征檢測器 cv::SurfFeatureDetector surf(2500); // 檢測SURF特征 surf.detect(image,keypoints); cv::Mat featureImage; cv::drawKeypoints(image, // 原始圖像 keypoints, // 特征點的向量 featureImage, // 生成圖像 cv::Scalar(255,255,255), // 特征點的顏色 cv::DrawMatchesFlags::DRAW_RICH_KEYPOINTS); // 標志位 cv::namedWindow("SURF Features"); cv::imshow("SURF Features",featureImage); return a.exec(); } ~~~ 效果: ![](https://box.kancloud.cn/2015-12-30_5683a75e3f0a7.jpg) 從兩種算法的輸出結果可以看出,SURF與SIFT描述子的區別主要是速度及精度。SURF描述子大部分基于強度的差值,計算更加快捷,而SIFT描述子通常在搜索正確的特征點時更加精確。 參考資料: David G.Lowe Object Recognition from Local Scale-Invariant Features. 1999. David G.Lowe Distinctive Image Features from Scale-Invariant Keypoints. January 5, 2004. SIFT官網的Rob Hess?[hess@eecs.oregonstate.edu](mailto:hess@eecs.oregonstate.edu)?SIFT源碼 參考博客: [http://blog.csdn.net/zddblog/article/details/7521424](http://blog.csdn.net/zddblog/article/details/7521424)?(個人認為是目前最詳盡的SIFT介紹) [http://underthehood.blog.51cto.com/2531780/658350](http://underthehood.blog.51cto.com/2531780/658350) [http://blog.csdn.net/xiaowei_cqu/article/details/8069548](http://blog.csdn.net/xiaowei_cqu/article/details/8069548) [http://www.cnblogs.com/tornadomeet/archive/2012/08/16/2643168.html](http://www.cnblogs.com/tornadomeet/archive/2012/08/16/2643168.html)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看