日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

SLAM: 图像角点检测的Fast算法(OpenCV文档)

發布時間:2023/12/31 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SLAM: 图像角点检测的Fast算法(OpenCV文档) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?????? 官方鏈接:http://docs.opencv.org/trunk/doc/py_tutorials/py_feature2d/py_fast/py_fast.html#fast-algorithm-for-corner-detection

?????? 原文鏈接:http://blog.csdn.net/candycat1992/article/details/22285979

???????本文做了少量修改,并添加了C++代碼,若有疑問或者版權問題,請拜讀作者或者通知本人。

目標

  • 理解FAST算法的基本原理
  • 使用OpenCV的FAST函數進行角點(corners)檢測

原理


我們已知很多種特征檢測的方法,而且它們其中很多效果都非常不錯。但是,當從一個實時運行的程序角度出發,它們還不夠快。一個最好的例子就是SLAM(Simultaneous Localization and Mapping)移動機器人,它的可計算資源是受限的。
作為上述問題的一個解決方法,FAST(Features from Accelerated Segment Test)算法由Edward Rosten 和 Tom Drummond在他們2006年的論文“Machine learning for high-speed corner detection”(在2010年再次被修訂)中被提出。下面是該算法的一個基本總結。你可以參見原論文去學習更多的細節(下面所有的圖片是從原論文中提取的)。

使用FAST進行特征檢測


  • 從圖片中選取一個像素點Pi,下面我們將判斷它是否是一個特征點。我們首先把它的密度(即像素值)設為I_p。
  • 設定一個合適的闕值T。
  • 考慮該像素點周圍的16個像素。(見下圖)

  • 現在,如果在這個大小為16個像素的圓上有n 個連續的像素點,它們的像素值要么都比I_p+T大,要么都比I_p-T小,那么它就是一個角點。(如上圖中白色虛線所示)。n 這里被設定為12。

  • 我們現在應該提出一個高效的測試,來快速排除一大部分是非角點的點。該測試僅僅檢查在位置1、9、5和13四個位置的像素(首先檢查1和9,看它們是否亮于或暗于闕值。如果是,再檢查5和13)。如果Pi是一個角點,那么上述四個像素點中至少有3個應該必須都大于I_p +T 或者小于I_p- T(因為若是一個角點,超過四分之三個圓的部分應該滿足判斷條件,半圓比包含上述某三個點)。如果都不滿足,那么Pi 不可能是一個角點。完整的分段測試可以被用于接受的所有候選點,通過檢測圓上的所有點。這種檢測有很好的性能,但是有一些缺點:
    1.?當n < 12時不能拒絕許多候選點。
    2. 檢測出來的角點不是最優的,這是因為它的效率是依靠角點外形的排列和分布的。
    3.?
    4. 相鄰的多個特征點會被檢測到

  • 前三個問題可以使用機器學習的方法解決。最后一個可以使用non-maximal suppression


    機器學習


  • 選擇一個圖片集合進行學習(最好是來自于目標應用定義域)。
  • 在每一張圖上運行FAST算法,找到特征點。
  • 對于每個特征點,存儲它周圍的16個像素點到一個vector中。為所有的圖片做同樣的事,得到它們所有特征點的vector?P。
  • 這16個像素中的每一個像素(假設為x),可以有下面三種狀態中的一種:

  • 依靠這些狀態,特征向量P被劃分為3個子集,P_d,P_s,P_b。
  • 定義一個新的布爾變量,K_p。如果P是一個角點,那些K_p為真;否則為假。
  • 使用ID3算法(決策樹分類器)來查詢每一個子集。
  • 遞歸計算所有的子集直到它的嫡為0。
  • 被創建的決策樹就被用于其他圖片的fast檢測。

  • non-maximal suppression


    從鄰近的位置選取了多個特征點是另一個問題。我們可以使用non-maximal suppression來解決。
  • 為每一個檢測到的特征點計算它的分數函數(score function),V。V是 P 和它周圍16個像素點的絕對偏差的和。
  • 考慮兩個相鄰的特征點,并比較它們的v值。
  • v 值較低的點將會被剔除。

  • 總結


    FAST算法比其他已知的角點檢測法要快很多倍。 但是當圖片的噪點較多時,它的健壯性并不好。這依靠一個闕值。

    OpenCV中的FAST特征檢測


    和OpenCV中其他特征檢測器的調用相同。如果你想,你可以指定一個闕值,或者決定是否使用non-maximal suppression來判斷鄰近特征點。
    對于相鄰特征點,OpenCV定義了三個flags:
    • cv2.FAST_FEATURE_DETECTOR_TYPE_5_8
    • cv2.FAST_FEATURE_DETECTOR_TYPE_7_12
    • cv2.FAST_FEATURE_DETECTOR_TYPE_9_16
    下面是一個簡單的示例代碼(Python)。 import numpy as np import cv2 from matplotlib import pyplot as plt img = cv2.imread('simple.jpg',0) # Initiate FAST object with default values fast = cv2.FastFeatureDetector() # find and draw the keypoints kp = fast.detect(img,None) img2 = cv2.drawKeypoints(img, kp, color=(255,0,0)) # Print all default params print "Threshold: ", fast.getInt('threshold') print "nonmaxSuppression: ", fast.getBool('nonmaxSuppression') print "neighborhood: ", fast.getInt('type') print "Total Keypoints with nonmaxSuppression: ", len(kp) cv2.imwrite('fast_true.png',img2) # Disable nonmaxSuppression fast.setBool('nonmaxSuppression',0) kp = fast.detect(img,None) print "Total Keypoints without nonmaxSuppression: ", len(kp) img3 = cv2.drawKeypoints(img, kp, color=(255,0,0)) cv2.imwrite('fast_false.png',img3)
    C++代碼段:

    int CEkfSlam::fast_corner_detect_9(cv::Mat &im, double threshold, std::vector<CvPoint> &coords) {//提取快速角點//一次只提取一個角點?//且有時可能會不發現角點,可能一次有多個角點cv::Mat image(im.rows, im.cols, 1);if (3== im.channels() ){cv::cvtColor (im,image,CV_BGR2GRAY); }else{image =im.clone();}//快速角點檢測 std::vector<cv::KeyPoint> keypoints; cv::FAST(image,keypoints,threshold,true); //默認開啟極大值抑制!coords.resize(keypoints.size() );//cv::imshow("kp",image);cv::waitKey(0);for (int i=0;i< keypoints.size();++i){coords[i].x =keypoints[i].pt.x;coords[i].y =keypoints[i].pt.y;}return 1; }
    值得注意的是,下面的寫法會出現內存問題:
    cv::FastFeatureDetector fast(threshold, true); fast.detect(image, allKeypoints[0]);</del>
    下面是測試結果。左邊是使用了nonmaxSuppression的FAST,右邊則沒有使用。
    ?


    總結

    以上是生活随笔為你收集整理的SLAM: 图像角点检测的Fast算法(OpenCV文档)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。