[300 rutinas OpenCV] 243. Algoritmo FAST para detección de características

"300 rutinas OpenCV de youcans - catálogo general"


[300 rutinas OpenCV de youcans] 243. Algoritmo FAST para detección de características


6.6.1 Introducción al algoritmo FAST

FAST (Features from Accelerated Segment Test) es un algoritmo de detección de puntos característicos que se utiliza para la extracción de características, pero no implica la descripción de características.

SIFT y SURF requieren una gran cantidad de cómputo, lo que dificulta cumplir con los requisitos en tiempo real. Edward Rosten propuso el algoritmo de detección de características FAST en 2006. El algoritmo FAST discrimina puntos característicos comparando resultados con píxeles circunferenciales, con una velocidad de cálculo rápida y alta repetibilidad, lo cual es muy adecuado para el procesamiento de video en tiempo real.

El algoritmo FAST define una esquina como un píxel que probablemente sea una esquina si difiere significativamente de varios píxeles en su vecindario circundante.

Por lo tanto, 16 puntos de píxel se toman uniformemente en el círculo centrado en el punto de píxel.Si la diferencia entre los valores de píxel de N píxeles consecutivos y el punto central es mayor que el umbral establecido, el píxel central se determina como un punto de esquina . Hay dos casos específicos, uno es que N píxeles consecutivos son más brillantes que el punto central, y el otro es que N píxeles consecutivos son más oscuros que el punto central, y la diferencia de brillo es mayor que el umbral establecido t.

Para mejorar la eficiencia de detección, se puede eliminar una gran cantidad de puntos que no son esquinas mediante una detección preliminar: si N = 12, tres de los cuatro puntos de intersección entre la circunferencia y el eje vertical del eje horizontal deben cumplir con el brillo anterior condiciones de diferencia. Calcule la diferencia de píxeles entre p1, p9, p5, p13 y el punto central P. Si al menos 3 diferencias de píxeles cumplen la condición de umbral, se utilizarán como puntos candidatos, de lo contrario, se rechazarán.

En OpenCV, los dos puntos de intersección del eje horizontal y el eje vertical se detectan respectivamente para la detección preliminar: (1) Calcular la diferencia de píxeles entre p1, p9 y el punto central p, y eliminar si no se cumple la condición de umbral; ( 2) Calcular p5, p13 La diferencia de píxeles con el punto central p, si no cumple con la condición de umbral, será rechazado.

inserte la descripción de la imagen aquí

Los pasos de implementación del algoritmo FAST son:

(1) Establezca el umbral de comparación t, que se utiliza para comparar si la diferencia de valores de píxeles es lo suficientemente grande.

(2) Construya una ventana móvil, seleccione 16 píxeles del círculo con el píxel p como centro y radio 3, numerados p1~p16.

(3) Calcule la diferencia de píxeles entre el píxel pk y el punto central p y compare: ( I pk − I p > t ) o ( I p − I pk > t ) (I_{pk}-I_p>t) \ o \ (I_p-I_{pk}>t)( yop kyopag>t ) o ( yo  pagyop k>t )

3.1 Calcule la diferencia de píxeles entre p1, p9, p5, p13 y p. Si al menos 3 de las diferencias de píxeles son mayores que el umbral t (o menores que -t), entonces P es un punto candidato, de lo contrario p no es un punto característico;

3.2 Si p es un punto candidato, calcule la diferencia de píxeles entre p1~p16 y el punto central p. Si la diferencia de píxeles de al menos 9 (o 12) puntos seguidos es mayor que el umbral t (o menor que -t ), entonces P es un punto característico.

(4) Supresión de valores no máximos: si hay varios puntos característicos en la vecindad, solo se conserva el punto característico con el mayor valor de respuesta.

Ventajas y desventajas del algoritmo FAST:

(1) El algoritmo FAST es simple y rápido, mucho más rápido que otros algoritmos;

(2) El algoritmo FAST es muy sensible a la influencia del ruido, y el tamaño del umbral t tiene una gran influencia en los resultados;

(3) El algoritmo FAST básico no genera características multiescala, ni tiene información de orientación, por lo que no tiene invariancia de escala ni invariancia de rotación.


6.6.2 Clase FastFeatureDetector en OpenCV

OpenCV proporciona una gran cantidad de algoritmos de detección de características y hereda la clase cv::Feature2D, utilizando una definición y encapsulación unificadas.

OpenCV proporciona la clase cv::FastFeatureDetector para implementar el método FastFeatureDetector, hereda la clase cv::Feature2D y la crea mediante el método create static.

El constructor de la clase FastFeatureDetector es:

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

En el lenguaje Python, OpenCV proporciona la función de interfaz cv.FastFeatureDetector.create() de la clase FastFeatureDetector para instanciar la clase FastFeatureDetector.

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 

Descripción de parámetros:

  • imagen: imagen de entrada, canal único
  • keypoints : Puntos clave detectados, es una estructura de datos especial que incluye las siguientes propiedades:
    • Point2f pt: coordenadas
    • tamaño del flotador: el diámetro de la vecindad del punto clave
    • ángulo de flotación: la dirección del punto clave, el valor es [0, 360)
    • respuesta flotante: la fuerza de respuesta del punto clave
    • octava int: el grupo de pirámides de imágenes donde se encuentran los puntos clave
    • int class_id: el número de identificación del punto clave
  • umbral: umbral de diferencia t, opcional, el valor predeterminado es 10
  • nonmaxSuppression: si se realiza una supresión no máxima, opcional, el valor predeterminado es verdadero
  • tipo: tipo de esquema de detección, valor predeterminado TYPE_9_16
    • FastFeatureDetector::TYPE_9_16, que indica que 16 píxeles en la circunferencia / 9 píxeles consecutivos cumplen las condiciones
    • FastFeatureDetector::TYPE_7_12, que indica que 12 píxeles en la circunferencia / 7 píxeles consecutivos cumplen las condiciones
    • FastFeatureDetector::TYPE_5_8, que indica que 8 píxeles en la circunferencia/5 píxeles consecutivos cumplen las condiciones
  • máscara: imagen de máscara, canal único de 8 bits, especifica el área para encontrar puntos clave, opcional

Precauciones:

  • La función cv.FastFeatureDetector.create() instancia la clase FastFeatureDetector y construye un objeto FastFeatureDetector.
  • El valor del umbral de diferencia es muy importante, lo que afecta seriamente el resultado de la detección.

Rutina 14.25: Algoritmo FAST para detección de características

    # 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()

resultado de la operación:

umbral: 10
número de Keypoints sin NMS: 12100
número de Keypoints con NMS: 3704

umbral: 20
número de Keypoints sin NMS: 5591
número de Keypoints con NMS: 1892

umbral: 40
número de Keypoints sin NMS: 1974
número de Keypoints con NMS: 840


inserte la descripción de la imagen aquí


参考文献:Edward Rosten y Tom Drummond, "Aprendizaje automático para la detección de esquinas a alta velocidad" en la 9ª Conferencia Europea sobre Visión por Computador, vol. 1, 2006, págs. 430–443.

inserte la descripción de la imagen aquí

【Fin de esta sección】

Declaración de derechos de autor:
obras originales de Youcans@xupt, las reimpresiones deben estar marcadas con el enlace original: (https://blog.csdn.net/youcans/article/details/127333535)
Copyright 2022 youcans, XUPT Creado
: 2022-10-15

240. Detección de esquinas de Shi-Tomas en OpenCV
241. Transformación de características invariantes de escala (SIFT)
242. Algoritmo acelerado de detección de características robustas (SURF)
243. Algoritmo FAST para detección de características

Supongo que te gusta

Origin blog.csdn.net/youcans/article/details/127333535
Recomendado
Clasificación