[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.
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 k−yopag>t ) o ( yo pag−yop 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
参考文献: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.
【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-15240. 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