[300 OpenCV-Routinen] 243. FAST-Algorithmus zur Merkmalserkennung

"300 OpenCV-Routinen von youcans - Gesamtkatalog"


[300 OpenCV-Routinen von youcans] 243. FAST-Algorithmus zur Merkmalserkennung


6.6.1 Einführung in den FAST-Algorithmus

FAST (Features From Accelerated Segment Test) ist ein Merkmalspunkterkennungsalgorithmus, der zur Merkmalsextraktion verwendet wird, jedoch keine Merkmalsbeschreibung beinhaltet.

SIFT und SURF erfordern einen großen Rechenaufwand, was es schwierig macht, die Echtzeitanforderungen zu erfüllen. Edward Rosten schlug 2006 den FAST-Merkmalserkennungsalgorithmus vor. Der FAST-Algorithmus unterscheidet Merkmalspunkte, indem er Ergebnisse mit Umfangspixeln vergleicht, mit schneller Berechnungsgeschwindigkeit und hoher Wiederholbarkeit, was sehr gut für die Echtzeit-Videoverarbeitung geeignet ist.

Der FAST-Algorithmus definiert eine Ecke als ein Pixel, das wahrscheinlich eine Ecke ist, wenn es sich deutlich von mehreren Pixeln in seiner Umgebung unterscheidet.

Daher werden 16 Pixelpunkte gleichmäßig auf dem Kreis genommen, der auf den Pixelpunkt zentriert ist.Wenn die Differenz zwischen den Pixelwerten von aufeinanderfolgenden N Pixeln und dem Mittelpunkt größer als der eingestellte Schwellenwert ist, wird der mittlere Pixel als Eckpunkt bestimmt . Es gibt zwei spezifische Fälle, der eine ist, dass N aufeinanderfolgende Pixel heller als der Mittelpunkt sind, und der andere ist, dass N aufeinanderfolgende Pixel dunkler als der Mittelpunkt sind und die Helligkeitsdifferenz größer als der eingestellte Schwellenwert t ist.

Um die Detektionseffizienz zu verbessern, kann eine große Anzahl von Nicht-Eckpunkten durch vorläufiges Screening eliminiert werden: Wenn N = 12, müssen drei der vier Schnittpunkte zwischen dem Umfang und der vertikalen Achse der horizontalen Achse die obige Helligkeit erfüllen Unterschiedsbedingungen. Berechnen Sie die Pixeldifferenz zwischen p1, p9, p5, p13 und dem Mittelpunkt p. Wenn mindestens 3 Pixeldifferenzen die Schwellenwertbedingung erfüllen, werden sie als Kandidatenpunkte verwendet, andernfalls werden sie zurückgewiesen.

In OpenCV werden die beiden Schnittpunkte der horizontalen Achse und der vertikalen Achse jeweils für ein vorläufiges Screening erkannt: (1) Pixeldifferenz zwischen p1, p9 und dem Mittelpunkt p berechnen und entfernen, wenn die Schwellenbedingung nicht erfüllt ist; ( 2) Berechne p5, p13 Die Pixeldifferenz mit dem Mittelpunkt p, wenn sie die Schwellenbedingung nicht erfüllt, wird sie verworfen.

Bildbeschreibung hier einfügen

Die Implementierungsschritte des FAST-Algorithmus sind:

(1) Stellen Sie die Vergleichsschwelle t ein, die verwendet wird, um zu vergleichen, ob die Differenz der Pixelwerte groß genug ist.

(2) Konstruiere ein sich bewegendes Fenster, wähle 16 Pixel aus dem Kreis mit Pixel p als Zentrum und Radius 3 aus, nummeriert mit p1~p16.

(3) Berechnen Sie die Pixeldifferenz zwischen dem Pixel pk und dem Mittelpunkt p und vergleichen Sie: ( I pk − I p > t ) oder ( I p − I pk > t ) (I_{pk}-I_p>t) \ or \ ( I_p-I_{pk}>t)( ichp kichp>t ) oder ( I  pichp k>t )

3.1 Berechnen Sie die Pixeldifferenz zwischen p1, p9, p5, p13 und p. Wenn mindestens 3 der Pixeldifferenzen größer als der Schwellenwert t (oder kleiner als -t) sind, dann ist P ein Kandidatenpunkt, andernfalls ist p nicht a Merkmalspunkt;

3.2 Wenn p ein Kandidatenpunkt ist, berechnen Sie die Pixeldifferenz zwischen p1~p16 und dem Mittelpunkt p. Wenn die Pixeldifferenz von mindestens 9 (oder 12) Punkten in Folge größer als der Schwellenwert t (oder kleiner als -t ), dann ist P ein Merkmalspunkt .

(4) Nicht-Maximalwert-Unterdrückung: Wenn es mehrere Merkmalspunkte in der Nachbarschaft gibt, wird nur der Merkmalspunkt mit dem größten Antwortwert beibehalten.

Vor- und Nachteile des FAST-Algorithmus:

(1) Der FAST-Algorithmus ist einfach und schnell, viel schneller als andere Algorithmen;

(2) Der FAST-Algorithmus ist sehr empfindlich gegenüber dem Einfluss von Rauschen, und die Größe der Schwelle t hat einen großen Einfluss auf die Ergebnisse;

(3) Der grundlegende FAST-Algorithmus erzeugt weder Multiskalenmerkmale, noch hat er Orientierungsinformationen, also hat er keine Skaleninvarianz und Rotationsinvarianz.


6.6.2 FastFeatureDetector-Klasse in OpenCV

OpenCV bietet eine Fülle von Feature-Erkennungsalgorithmen und erbt die cv::Feature2D-Klasse unter Verwendung einer einheitlichen Definition und Kapselung.

OpenCV stellt die cv::FastFeatureDetector-Klasse bereit, um die FastFeatureDetector-Methode zu implementieren, erbt die cv::Feature2D-Klasse und erstellt sie durch die statische Methode create.

Der Konstruktor der FastFeatureDetector-Klasse ist:

static Ptr< FastFeatureDetector >
cv::FastFeatureDetector::create (int threshold=10, bool nonmaxSuppression=true, FastFeatureDetector::DetectorType type=FastFeatureDetector::TYPE_9_16)

In der Python-Sprache stellt OpenCV die Schnittstellenfunktion cv.FastFeatureDetector.create() der FastFeatureDetector-Klasse bereit, um die FastFeatureDetector-Klasse zu instanziieren.

cv.FastFeatureDetector.create([, threshold=10, nonmaxSuppression=true, type=FastFeatureDetector::TYPE_9_16]) → retval
cv.FastFeatureDetector_create([, threshold=10, nonmaxSuppression=true, type=FastFeatureDetector::TYPE_9_16]) → retval
FastFeatureDetector.detect(image, [, mask]) → keypoints 

Parameterbeschreibung:

  • Bild: Eingangsbild, Einzelkanal
  • keypoints : Erkannte Keypoints, ist eine spezielle Datenstruktur, die die folgenden Eigenschaften enthält:
    • Point2f pt: Koordinaten
    • Schwimmergröße: der Nachbarschaftsdurchmesser des Schlüsselpunkts
    • Schwimmwinkel: die Richtung des Schlüsselpunkts, der Wert ist [0, 360)
    • Float-Antwort: Die Antwortstärke des Schlüsselpunkts
    • int octave: die Gruppe von Bildpyramiden, in denen sich die Keypoints befinden
    • int class_id: die ID-Nummer des Schlüsselpunkts
  • Schwelle: Differenzschwelle t, optional, Standardwert ist 10
  • nonmaxSuppression: Ob eine nicht maximale Unterdrückung durchgeführt werden soll, optional, der Standardwert ist wahr
  • Typ: Typ des Erkennungsschemas, Standardwert TYPE_9_16
    • FastFeatureDetector::TYPE_9_16, was anzeigt, dass 16 Pixel am Umfang / 9 aufeinanderfolgende Pixel die Bedingungen erfüllen
    • FastFeatureDetector::TYPE_7_12, was anzeigt, dass 12 Pixel am Umfang / 7 aufeinanderfolgende Pixel die Bedingungen erfüllen
    • FastFeatureDetector::TYPE_5_8, was anzeigt, dass 8 Pixel am Umfang/5 aufeinanderfolgende Pixel die Bedingungen erfüllen
  • mask: Maskenbild, 8-Bit-Einzelkanal, gibt den Bereich zum Auffinden von Schlüsselpunkten an, optional

Vorsichtsmaßnahmen:

  • Die Funktion cv.FastFeatureDetector.create() instanziiert die FastFeatureDetector-Klasse und konstruiert ein FastFeatureDetector-Objekt.
  • Der Wert des Differenzschwellenwerts ist sehr wichtig, was das Erkennungsergebnis ernsthaft beeinflusst.

Routine 14.25: FAST-Algorithmus zur Merkmalserkennung

    # 14.25 特征检测之 FAST 算子
    # # 读取基准图像
    img = cv.imread("../images/Circuit04.png", flags=1)  # 基准图像
    gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)  # (425, 558)
    height, width = gray.shape[:2]
    print("shape of image: ", height, width)

    fast = cv.FastFeatureDetector_create()  # 初始化 FAST 对象
    # 默认值:threshold=10, nonmaxSuppression=true, type=FastFeatureDetector::TYPE_9_16
    kpNMS1 = fast.detect(img, None)  # 检测关键点
    imgFASTnms1 = cv.drawKeypoints(img, kpNMS1, None, color=(255, 0, 0))
    # 关闭非极大抑制
    fast.setNonmaxSuppression(0)  # nonmaxSuppression=false
    kp1 = fast.detect(img, None)
    imgFAST1 = cv.drawKeypoints(img, kp1, None, color=(255, 0, 0))
    print("\nthreshold: {}".format(fast.getThreshold()))
    print("num of Keypoints without NMS: {}".format(len(kp1)))
    print("num of Keypoints with NMS: {}".format(len(kpNMS1)))

    fastT2 = cv.FastFeatureDetector_create(threshold=20)  # 设置差分阈值为 20
    kpNMS2 = fastT2.detect(img, None)  # 检测关键点
    imgFASTnms2 = cv.drawKeypoints(img, kpNMS2, None, color=(255, 0, 0))
    # 关闭非极大抑制
    fastT2.setNonmaxSuppression(0)  # nonmaxSuppression=false
    kp2 = fastT2.detect(img, None)
    imgFAST2 = cv.drawKeypoints(img, kp2, None, color=(255, 0, 0))
    print("\nthreshold: {}".format(fastT2.getThreshold()))
    print("num of Keypoints without NMS: {}".format(len(kp2)))
    print("num of Keypoints with NMS: {}".format(len(kpNMS2)))

    fastT3 = cv.FastFeatureDetector_create(threshold=40)  # 设置差分阈值为 40
    kpNMS3 = fastT3.detect(img, None)  # 检测关键点
    imgFASTnms3 = cv.drawKeypoints(img, kpNMS3, None, color=(255, 0, 0))
    # 关闭非极大抑制
    fastT3.setNonmaxSuppression(0)  # nonmaxSuppression=false
    kp3 = fastT3.detect(img, None)
    imgFAST3 = cv.drawKeypoints(img, kp3, None, color=(255, 0, 0))
    print("\nthreshold: {}".format(fastT3.getThreshold()))
    print("num of Keypoints without NMS: {}".format(len(kp3)))
    print("num of Keypoints with NMS: {}".format(len(kpNMS3)))

    plt.figure(figsize=(9, 6))
    plt.subplot(231), plt.title("FAST without NMS (t=10)")
    plt.axis('off'), plt.imshow(cv.cvtColor(imgFAST1, cv.COLOR_BGR2RGB))
    plt.subplot(232), plt.title("FAST without NMS (t=20)")
    plt.axis('off'), plt.imshow(cv.cvtColor(imgFAST2, cv.COLOR_BGR2RGB))
    plt.subplot(233), plt.title("FAST without NMS (t=40)")
    plt.axis('off'), plt.imshow(cv.cvtColor(imgFAST3, cv.COLOR_BGR2RGB))
    plt.subplot(234), plt.title("FAST with NMS (t=10)")
    plt.axis('off'), plt.imshow(cv.cvtColor(imgFASTnms1, cv.COLOR_BGR2RGB))
    plt.subplot(235), plt.title("FAST with NMS (t=20)")
    plt.axis('off'), plt.imshow(cv.cvtColor(imgFASTnms2, cv.COLOR_BGR2RGB))
    plt.subplot(236), plt.title("FAST with NMS (t=40)")
    plt.axis('off'), plt.imshow(cv.cvtColor(imgFASTnms3, cv.COLOR_BGR2RGB))
    plt.tight_layout()
    plt.show()

Operationsergebnis:

Schwellenwert: 10
Anzahl Keypoints ohne NMS: 12100
Anzahl Keypoints mit NMS: 3704

Schwellenwert: 20
Anzahl Keypoints ohne NMS: 5591
Anzahl Keypoints mit NMS: 1892

Schwelle: 40
Anzahl Keypoints ohne NMS: 1974
Anzahl Keypoints mit NMS: 840


Bildbeschreibung hier einfügen


参考文献:Edward Rosten und Tom Drummond, „Machine learning for high speed corner detection“ in 9th European Conference on Computer Vision, vol. 1, 2006, S. 430–443.

Bildbeschreibung hier einfügen

【Ende dieses Abschnitts】

Copyright-Erklärung:
Youcans@xupt Originalwerke, Nachdrucke müssen mit dem Originallink gekennzeichnet werden: (https://blog.csdn.net/youcans/article/details/127333535)
Copyright 2022 youcans, XUPT Crated
: 2022-10-15

240. Shi-Tomas-Eckenerkennung in OpenCV
241. Skaleninvariante Merkmalstransformation (SIFT)
242. Accelerated Robust Feature Detection Algorithm (SURF)
243. FAST-Algorithmus zur Merkmalserkennung

Guess you like

Origin blog.csdn.net/youcans/article/details/127333535