# SURF

Speeded-Up Robust Features (SURF) es un algoritmo de visión por computador, capaz de obtener una representación visual de una imagen y extraer una información detallada y específica del contenido. Esta información es tratada para realizar operaciones como por ejemplo la localización y reconocimiento de determinados objetos, personas o caras, realización de escenas 3D, seguimiento de objetos y extracción de puntos de interés. Este algoritmo forma parte de la mencionada inteligencia artificial, capaz de entrenar un sistema para que interprete imágenes y determine el contenido. El Algoritmo SURF se presentó por primera vez por Herbert Bay en ECCV 9.ª conferencia internacional de visión por computador celebrada en Austria en mayo de 2006.

## Descripción

SURF, es un detector y un descriptor de alto rendimiento de los puntos de interés de una imagen, donde se transforma la imagen en coordenadas, utilizando una técnica llamada multi-resolución. Consiste en hacer una réplica de la imagen original de forma Piramidal Gaussiana o Piramidal Laplaciana, y obtener imágenes del mismo tamaño pero con el ancho de banda reducido. De esta manera se consigue un efecto de borrosidad sobre la imagen original, llamado Scale-Space. Esta técnica asegura que los puntos de interés son invariantes en el escalado. El algoritmo SURF está basado en el predecesor SIFT.

## Etapas SURF
### Detección

El algoritmo de SURF está basado en los mismos principios y pasos que el SIFT, pero utiliza un esquema diferente y esto debería proveer mejores resultados: más rapidez. Con el fin de detectar puntos característicos en una escala de manera invariable SIFT utiliza filtros de aproximación en cascada. Donde la Diferencia de Gaussianos, DOG, se calcula sobre imágenes re-escaladas progresivamente.

#### Imagen Integral

Semejante al SDoG.
En vez de utilizar gaussianas para promediar la imagen, se utilizan cuadrados (aproximaciones). Hacer la convolución de la imagen con un cuadrado es mucho más rápido si se utiliza la imagen integral.
La imagen integral se define como:
$I_{\Sigma }(\mathbf {x} )=\sum _{i=0}^{i<=x}\sum _{j=0}^{j<=y}I(x,y)$
donde $\mathbf {x} =(x,y)$.
La suma de la imagen original dentro de un rectángulo D de la imagen se puede evaluar rápidamente utilizando esta imagen integral. I (x, y) sumada sobre el área seleccionada requiere 4 evaluaciones de S (x, y) (A, B, C, D)

#### Puntos de interés en la matriz Hessiana

SURF utiliza un detector de BLOB (Binary Large Object) basado en el Hessiano para encontrar puntos de interés. El determinante de la matriz Hessiana expresa la extensión de la respuesta y es una expresión de un cambio local alrededor del área.
El detector se basa en la matriz Hessiana, debido a su buen desempeño en la precisión. Más precisamente, se detectan estructuras BLOB en lugares donde el factor determinante es el máximo. En contraste con el detector de Hess - Laplace para Mikolajczyk y Schmid, se basa en el determinante de la Hessiana también para la selección de escala, como se hace por Lindeberg. Dado un punto $\mathbf {x} =(x,y)$ en una imagen I, la matriz H Hessiana (x, σ) en x a escala σ se define de la siguiente manera:
$H(x,\sigma )={\begin{pmatrix}Lxx(x,\sigma )&Lxy(x,\sigma )\\Lxy(x,\sigma )&Lyy(x,\sigma )\end{pmatrix}}$
Donde $Lxx=(x,\sigma )$ es la convolución del segundo orden derivativo $\partial x/\partial x^{2}g(\sigma )$ con la imagen en el punto x, y de manera similar para $Lxy=(x,\sigma )$ y $Lyy=(x,\sigma )$.
Los Filtros Gaussianos son óptimos para el análisis de la escala - espacio, pero en la práctica deben ser discretizados y recortados. Esto conduce a una pérdida en la repetibilidad en rotaciones de imagen en torno a los múltiples impares de π / 4. Esta debilidad que vale para los detectores basados en Hessiano en general. La repetibilidad alcanza un máximo alrededor de múltiplos de π / 2. Esto se debe a la forma cuadrada del filtro. Sin embargo, los detectores todavía funcionan bien, la discretización tiene un ligero efecto en el rendimiento. Como los filtros reales no son ideales, en todo caso, y dado el éxito de Lowe con sus aproximaciones logarítmicas, empujan a la aproximación de la matriz Hessiana aún más con los filtros cuadrados Estos filtros de segundo orden Gaussianos aproximados pueden ser evaluados con un coste computacional muy bajo con el uso de imágenes integrales. Por lo tanto, el tiempo de cálculo es independiente del tamaño del filtro. Estas son algunas aproximaciones: Gyy y Gxy (1)
Los box filters de 9x9 son aproximaciones de un Gaussiano con σ = 1.2 y representa la escala más baja (resolución espacial más alta) para computarizado los mapas de respuesta BLOB.
Se denota Dxx, Dyy, Dxy. Las ponderaciones aplicadas a las regiones rectangulares son mantenidas por la eficiencia de la CPU.
Se calculan las imágenes: -Dxx (x, y) a partir de I (x, y) y Gxx (x, y) -Dxy (x, y) a partir de I (x, y) y Gxy (x, y ) -Dyy (x, y) a partir de I (x, y) y Gxyyx, y)
Después se genera la siguiente imagen:
$Det(Haprox)=DxxDyy-(wDxy)^{2}$
La ponderación relativa ($w$) de la respuesta del filtro es utilizado para balancear la expresión por el determinante Hessiano. Es necesario para la conservación de la energía entre los kernels Gaussianos y los kernels Gaussianos aproximados.
$w={\frac {|Lxy(1.2)|F|Dyy(9)|F}{|Lyy(1.2)|F|Dxy(9)|F}}$
El factor de 0,9 aparece como un factor de corrección al utilizar cuadrados en vez de gaussianos. Se pueden generar varias imágenes det (H) por varios tamaños de filtros. Esto se denomina análisis multi-resolución.
|x|F es la norma de Frobenius.
Los cambios de ponderación dependen de la escala σ. En la práctica, se mantiene este factor constante. Como se mantiene constante? Normalizando la respuesta del filtro respecto a su tamaño. Esto garantiza la norma de Frobenius por cualquier otro filtro.
La aproximación del determinante de la matriz Hessiana representa la respuesta BLOB en la imagen en la localización x. Estas respuestas son almacenadas en el mapa de respuestas BLOB sobre diferentes escalas.
Seguidamente se pasa a buscar los máximos locales.

#### Representación espacio escala y localización de los puntos de interés

Los puntos de interés deben ser encontrados en diferentes escalas, entre otras cosas porque la búsqueda de correspondencias a menudo requiere su comparación en las imágenes donde se les ve a diferentes escalas. Los espacios escala se aplican en general como una pirámide de imagen. Las imágenes se suavizan repetidamente con un filtro gaussiano y luego, se submuestrea a fin de conseguir un nivel superior de la pirámide. Por lo tanto, se calculan varios pisos o escaleras del "det H" con varias medidas de las máscaras:
$\sigma approx=Currentfiltersize*\left({\frac {\left(BaseFilterscale\right)}{BaseFilterSize}}\right)$
Después se buscan los máximos 3D en (x, y, n) utilizando el cubo de vecindad 3x3x3. A partir de ahí se procede a hacer la interpolación del máximo. Lowe resto estas capas de la pirámide para conseguir que el DOG (Diferencia de gaussianas) encuentre en las imágenes los contornos y las manchas.
En concreto, se utiliza una variante rápida introducida por Neubecker y Van Gool. Los máximos del determinante de la matriz Hessiana interpolan en escala y espacio de la imagen con el método propuesto por Brown y Lowe. La aproximación del determinante de la matriz Hessiana representa la respuesta de BLOB en la imagen a la localización x. Estas respuestas son almacenadas en el mapa de respuestas de BLOB sobre diferentes escalas.

### Descripción

El objetivo de un descriptor es proporcionar una descripción única y robusta de un conjunto. Describe la distribución de intensidad del contenido dentro del punto de interés de los puntos vecinos. Es generado basándose en el área circundante de un punto de interés, por lo que, realmente, se obtiene un vector descriptor para cada punto de interés.
La dimensión del descriptor tiene un impacto directo con el tiempo de adquisición que se toma. De modo que, pocas dimensiones son indeseables por el "matching" de los puntos de interés, aunque proporciona menos distinciones que una dimensión mayor.
A continuación se demuestra todo el procedimiento que se lleva a cabo con el fin de realizar el proceso del descriptor.
El primer paso para obtener el descriptor una vez calculado el escalado es el cálculo de la orientación del punto de interés. Para obtener un punto invariante a las rotaciones, iluminación y orientación se utiliza el wavelet de Haar sobre las direcciones de x e y en una región circular de radio 6s, siendo s es la escala del punto de interés. Los puntos de interés de SURF tienen la característica principal de repetibilidad, que quiere decir que si un punto es considerado fiable, el detector encontrará el mismo punto bajo diferentes puntos de vista (escala, orientación, rotación, etc).
Se tiene una posición (x, y) para cada punto de interés.
Realizadas las respuestas Wavelet Haar con un Gaussiano centrado en el punto de interés, las respuestas son representadas como puntos en el espacio, donde la respuesta horizontal la tenemos en la abscisa y la respuesta vertical en la ordenada.
Una vez calculados para todos los vecinos, se estima la orientación dominante calculando la suma de todos los resultados dentro de una ventana deslizante que cubre un ángulo de $\pi /3$.
Se suman la respuesta horizontal y vertical con la ventana. El vector más largo de las ventanas es lo que define la orientación del punto de interés. El tamaño de esta ventana debe tomarse en cuenta ya que si es demasiado pequeña, tendrá un solo gradiente dominante y si es demasiado grande, tenderá a dar tamaños de vector máximo que no representan la realidad correctamente.
Ahora, el cálculo del descriptor se realiza construyendo, primeramente, una región cuadrada centrada en el punto de interés y con un tamaño de 20s (figura)
La región de interés se divide regularmente en 4x4 subregiones cuadradas, y para cada una de ellas se calculan unas características simples, el Wavelet de Haar para x e y, y se suavizan los resultados mediante un filtro Gaussiano (para ofrecer una mayor robustez a deformaciones, ruido y traslaciones), obteniendo dx y dy. El tamaño de este es de 2s, La verticalidad (si es horizontal o vertical) se define ahora respecto la orientación del punto de interés.
Para cada sub-región se suman los resultados $dx$ i $dy$, además de calcularse su valor absoluto | dx | y | dy |. De esta manera, cada subregión proporciona un vector $v$, que estará compuesto por:
$v=(\sum _dx,\sum _dy,\sum _|dx|,\sum _|dy|)$
El cual es distintivo y al mismo tiempo robusto al ruido, errores y deformaciones geométricas o fotométricas. El descriptor del SURF obtiene mediante la unión de los vectores de las subregiones.

### Matching up

En este apartado se detalla el paso posterior a la busca de puntos característicos que nos proporciona el detector. De este modo se pueden comparar descriptores entre pares de imágenes y buscar correspondencias entre ellas. Hay dos maneras posibles para llevarlo a término:
* Obtener los puntos característicos de la imagen primera y su descriptor y hacer el mismo con la segunda imagen. Así se podrán comparar los descriptores de las dos imágenes y establecer las correspondencias entre puntos con algún tipo de medida.
* Obtener los puntos característicos de la primera imagen con el descriptor. Posteriormente comparar este descriptor con los puntos de la segunda imagen donde se cree que está su pareja correspondiente.

## Desarrollo de un algoritmo utilizando el método SURF

1- INICIO:
Inicialización de todas las variables globales y las funciones necesarias para ejecutar el programa.
2- BUSCAR CÁMARA:
Si hay una cámara conectada, pasa a la etapa: Capturar secuencia y la almacena en el equipo. Si no es así, se comienza la etapa de buscar, si es una recibe de una secuencia de un vídeo almacenado en el equipo.
3-BUSCAR VIDEO:
Solo entra si el algoritmo no encontró ningún dispositivo de vídeo conectado al equipo. Si se recibe una ruta de secuencia de vídeo almacenado, se pasa a la etapa de capturar secuencia. Si no se recibe ruta, se cierra.
4-CAPTURA DE IMAGEN:
Puede capturar la imagen a partir de la cámara o del vídeo almacenado. Extrae por cada iteración un cuadro. Si no hay cuadro (apuntador de la imagen es NULLA), finaliza la ejecución del programa.
5- HAY IMAGEN:
Se revisa etapa anterior, si el apuntador no marca ninguna dirección de memoria, se acaba la ejecución. Si hay imagen, pasa a la etapa de aplicar filtro para suavizar la imagen. Pueden utilizarse filtros gaussianos (Son los más nítidos), de promedio, etc...
6-MOSTRAR VIDEO:
Muestra por pantalla para cada iteración del ciclo, la imagen obtenida en la etapa de captura de imagen.
7- PAUSA VÍDEO:
Se puede parar el vídeo, y la última imagen obtenida por la etapa de captura es mostrada por pantalla en una ventana distinta a la que pasaría a la siguiente etapa.
8-SELECCIÓN ROI (Region of interest):
Con la imagen en la ventana duplicada una vez hecha la pausa, se selecciona el área de la imagen o zona. La zona seleccionada, aparecerá en otra ventana para ser cogida como imagen base en la que se podrá analizar el resto del vídeo. Esta nueva imagen será almacenada temporalmente y paralelamente al algoritmo.
9-SELECCIÓN DE LOS PUNTOS DE LA MÁSCARA:
La máscara es una imagen que contiene dos colores: Blanco y negro. Esta se toma como imagen base para la búsqueda de puntos de interés en el algoritmo de SURF en pasos posteriores.
10-CONVERSIÓN DE IMAGEN A ESCALA DE GRISES:
Se convierte la imagen a escala de grises, debido a que el algoritmo necesita de la primera imagen seleccionada por el usuario y tomando como límite el área en blanco de la selección de puntos de máscara.
11- EXTRACCIÓN DE PUNTOS SURF:
Esta etapa extrae los puntos de interés ( Descriptores de imagen) de la primera imagen seleccionada por el usuario y tomando como límite el área en blanco de la selección de puntos de máscara.
12- Almacenamiento De IMAGEN DE BASE:
Guarda temporalmente las imágenes que se cogerán por una futura comparación con el resto de la secuencia de vídeo. Estas serán:
-Imagen obtenida de la selección la *ROI en escalera de grises.
-Máscara de blanco y negro de la etapa de selección de puntos de máscara.
13-COMPARACIÓN ENTRE PLANTILLAS UTILIZANDO SURF:
Las imágenes anteriores, no se modifican y se comparan con las otras de la secuencia de vídeo. En esta etapa se podrá identificar los descriptores de imagen y los descriptores de la secuencia de vídeo, trazando una línea entre ellos.
El cambio entre estos descriptores, nos determinará si el objeto seleccionado se encuentra obstruido parcialmente o si ha sido removido.
14- *CONTADOR De OBSTRUCCIÓN:
Esta etapa se utiliza por si el objeto ha sido obstruido parcialmente o totalmente por un periodo corto de tiempo. Es tendrán dos *contadors temporales:
-*Contador de obstrucción: *Contador de tiempo o ciclos que indica si el objeto ha sido *encavalcat o obstruido. *Mentres el objeto está *encavalcat, el *contador va aumentando, cuando llega a el máximo , se activa el *contador fin de programa.
-*Contador de fin de programa: Apaga el programa o muestra advertencia de si se llega a un cierto tiempo o ciclos donde el objeto todavía no está. Después de haber llegado al máximo en el *contador de obstrucción. Si ha sido una obstrucción temporal, los *contadors se reinicializan.
15- ADVERTENCIA OBJETO OBSTRUIDO:
El vídeo se detiene si se confirma si el objeto se ha perdido o ha sido obstruido por un tiempo considerable. También indica el segundo en que el algoritmo lo detecta. Gastado muestra la imagen parada de el vídeo y finalmente, acaba el programa.
16- VALORES DE LOS DESCRIPTORS:
Teniendo ya, los valores tomados en la etapa de extracción de puntos SURF, se crea una condición para determinar si el objeto está presente o no. Si se cogen 4 descriptores, X < 4, siendo X el número de descriptores analizados en cada cuadro. De este modo, se revisa si el objeto está o no.
17- LOCALIZACIÓN OBJETO. UBICACIÓN PUNTOS *FLANN.
Se encuentran las relaciones entre los puntos descriptores tanto de la imagen como de la secuencia de vídeo y se traza una línea.
Localización objeto mediante homografía.
18- *ADELANTAR EL *VIDEO EN Tu

## Surf vs Sift
### Presentación de los algoritmos

El reconocimiento de imágenes u objetos, es una de las aplicaciones más importantes de la visión por computador, se hace una comparación de los descriptores locales SIFT( Scale Invariant Feature Transform) [David Lowe, 1999] y SURF (Speeded-UP Feature transform) [Bay y Tuytelaars 2006]. Estos dos descriptores locales permiten detectar estructuras o puntos muy significativos de una imagen para obtener una descripción discriminativa de estas zonas a partir de sus puntos vecinos, con el objetivo de compararlas con otros descriptores utilizando medidas similares. A continuación se dan algunas características básicas de estos dos algoritmos:
SIFT ( Scale Invariant Feature Transform)
Fue publicado por David Lower en 1999 con la idea de proponer un algoritmo capaz de extraer las características de una imagen y a partir de estas describir el conjunto de objetos que estaban contenidos en ella. Este algoritmo se puede desglosar en 4 etapas:
-Detección de los extremos en la escala: la primera etapa realiza una búsqueda en las diferentes escalas y dimensiones de la imagen identificando posibles puntos de interés, invariantes a los cambios de orientación y escalado. Este procedimiento se lleva a cabo con la función DoG (Difference-of-Gaussian) dando diferentes valores a la σ, en la siguiente ecuación:
$D\left(x,y,\sigma \right)=L\left(x,y,k_{i}\sigma \right)-L\left(x,y,k_{j}\sigma \right),$
Donde G es la función Gaussiana y la I es la imagen. Ahora las imágenes gaussianas se restan para poder producir el DoG, después de eso se submostrea la imagen Gaussiana por un factor 2 para obtener una DoG muestreo de la imagen. Cada píxel se fija con sus vecinos con una máscara 3x3 para encontrar los máximos y mínimos locales de D (x, y, σ).
- Localización de los keypoints: los puntos claves se eligen sobre la base de medidas de estabilidad, se eliminan los puntos claves con bajo contraste o se encuentran localizados en los márgenes.
- Asignación de la orientación: la invariancia respecto a la rotación se consigue mediante la asignación a cada uno de los puntos de la orientación basada en las propiedades locales de la imagen y que representa el descriptor respecto a esta orientación.
- Descriptor De keypoints: Los gradientes locales de la imagen se miden en la región que rodea el punto clave. Estos son transformados mediante una representación que permite medir niveles de distorsión y cambios en la iluminación de forma local.
Más información SIFT
SURF (Speeded-UP Feature Transform)
Como ya hemos visto en apartados anteriores, el SURF es un algoritmo desarrollado por Herbert Bay, Tinne Tuytelaars y Luc Van Gool (2008), trabaja como un detector y descriptor de puntos de interés enfocado al reconocimiento de objetos. Este algoritmo tiene 3 etapas:
- Detección de los puntos de interés, keypoints.
- Asignación de orientación.
- Extracción de los descriptos.
Más información en los apartados de características.

### Diferencias teóricas

Las diferencias principales entre los algoritmos SIFT y SURF son la velocidad de aplicación de uno respecto al otro, pero con ambos obtenemos los puntos de interés invariantes de la imagen, en escala y orientación, y los cambios en la iluminación. Las principales diferencias de datos en múltiples experimentos son que en el SIFT se guarda la posición, la escala y la orientación, ya que es posible que en una misma posición (x,y), nos encontremos varios puntos de interés a diferente escala y/o orientación σ. Pero por otro lado en el SURF, en una posición (x,y) solo aparece un único punto de interés, por lo que no se guarda la escala y orientación, sin embargo sí que registra la matriz de segundo orden y el signo del Laplaciano.

### Diferencias experimentales
#### Experimento 1

Al hacer comparaciones se debe tener en cuenta las versiones de los algoritmos que se utilizan en cada caso, en este artículo se obtienen conclusiones con la versión 4 del SIFT y la versión 1.0.9 del SURF con código C y analizando imágenes con escala de grises. También se extraen conclusiones de resultados de experimentos con robots y respuesta de los algoritmos en plataformas Android.
El resultado de las pruebas con 109 imágenes, como ya anunciábamos antes, se ha constatado que el método SURF es mucho más rápido que el SIFT. Desde el punto de vista de puntos invariantes detectados, el algoritmo SIFT sobrepasa al SURF con más del doble de puntos detectados. Esto es causado porque el SURF permite que haya varios puntos invariantes en una misma posición con diferente escala u orientación, mientras que en el SIFT si que es posible. Este hecho hace que la distancia entre el número de características detectadas disminuiría si el SIFT no hiciera la duplicación de puntos. Las gráficas muestran que el método SIFT tiene unos 2.68 puntos invariantes más que el SURF respecto al tiempo, el SIFT utiliza unos 1.646 ms para analizar una imagen y el SURF 485 ms, es casi una tercera parte del tiempo, la eficiencia en este factor es considerable. Este factor es importante de cara al objetivo de cada proyecto, si se desea un algoritmo con el que se pueda obtener una gran cantidad de datos sería más recomendable el SIFT, pero se necesita una respuesta rápida y no damos tanta importancia al número de características detectadas, el algoritmo SURF es el más adecuado.
| SIFT | SURF |
Hay que detallar que el orden de las imágenes al comparar la foto es muy importante, ya que los resultados pueden variar si se escoge una comparación con X vs Y que si se hace con Y vs X. El método SIFT muestra más puntos cuando las imágenes que se comparan tienen más puntos en común, a diferencia del SURF da más valores cuando las imágenes están más diferenciadas, valores de falso positivos. Esto sucede con todas las fotografías y permite concluir que el algoritmo SIFT tiene más perdurabilidad en el tiempo que SURF, obteniendo emparejamientos más fiables.
| 109 IMATGES | SIFT | SURF |
| Puntos detectados | 1292 | 482 |
| Media de tiempo | 1646.53 ms | 485.77 ms |
*Datos extraídos de un análisis hecho por A. M. Romero y M. Cazorla, en el documento "Comparativa de detectores de características visuales y su aplicación al SLAM "

#### Experimento 2

El siguiente estudio es un experimento de rendimiento, consumo y eficacia de los algoritmos, en los que se han realizado 100 logotipos preparados y se ha ejecutado 10 veces cada prueba de funcionalidad, con el objetivo de ver si los algoritmos modifican su comportamiento según el estado del dispositivo móvil.
Las componentes del escenario de pruebas eran las siguientes:
Base de datos: aloja una tupla compuesta por un vector de características y otro de puntos de interés.
Componente de entrenamiento: permite guardar la base de datos y los puntos de interés generados por algoritmos.
Componente de prueba: permite obtener el vector de características y los puntos de interés generados por cada descriptor (SIFT, SURF) a partir de una imagen de entrada.
Componente de búsqueda (matching): permite obtener un conjunto de correspondencias entre la tupla obtenida y las tuplas de la base de datos.
| | SIFT | SURF |
| Promedio de puntos de interés | 222 | 431 |
| Tiempo de ejecución | 2887.13 ms | 959.87 ms |
| Consumo de batería | 0.04 % | 0.02 % |
| Memoria utilizada | 102.30 KB | 385.02 KB |
| Eficacia | 0.33 | 0.40 |
En la tabla anterior, los resultados obtenidos con respecto a los puntos de interés se observa la diferencia del promedio de puntos detectados por el método SIFT muy inferior al SURF, a causa de la diferencia en las imágenes comparadas. Respecto al tiempo de ejecución el SIFT es mucho más lento que el SURF, lo que indica que para aplicaciones en tiempo real este algoritmo debería descartarse. En el consumo de batería los resultados son proporcionales al tiempo de ejecución, así pues el SIFT consume el doble que el método SURF.
Respecto a la memoria utilizada, el método SURF supera ampliamente los recursos necesarios para almacenar los vectores de características de las imágenes, casi cuatro veces más que el método SIFT. En temas de eficacia el método SIFT también es menos eficaz que el SURF, pero ligeramente más bajo.

## Implementación SURF OpenCV
### Lenguaje y entorno C++

C++ es escogido por las siguientes razones:
Velocidad: Procesamiento de imágenes a bajo nivel se necesita ser rápido y C++ lo facilita.
Usabilidad: Es muy típico utilizar C++ en el procesamiento digital de imagen. Pero también es útil C o código Matlab.
Portabilidad: C++ es portable a múltiples plataformas, de esta manera se puede mover por diferentes plataformas y complidadores.
Librerías para el procesamiento de imagen: OpenCv es una librería de función en C++ que permite llegar a imágenes, videos y video en directo de la webcam o otros dispositivos. Soportado por windows y linux.
Un posible entorno es Visual Basic C++ juntamente con VC++, un potente IDE, que permite crear código fácilmente, así como organizar los proyectos. OpenCV se integra muy bien con e compilador. Visual C++ y OpenCV son gratuitos, cosa que permitirá a la librería ser distribuida sin restricciones de licencia.

### Diseño de la arquitectura
#### Imagen Integral

Descripción: El módulo crea y manipula las imágenes integradas.
Entradas: Una Imagen.
Procesos: Crea la representación de la imagen integral de imagen de entrada suministrada. Calcula la suma de píxeles sobre áreas rectangulares.
Salidas: La representación de la imagen integral.

#### Fast Hessian

Descripción: Encuentra la Hessiana basada en los puntos de interés / regiones en una imagen integral.
Entradas: Una representación de la imagen integral de una imagen.
Procesos: Construye determinante del Mapa de respuestas Hessiano. Realiza una supresión no máxima para localizar puntos de interés en un espacio Escala. Interpola, detecta puntos a precisión sub - píxel.
Salidas: Un vector de puntos de interés localizados con precisión.

#### SURF Descriptor

Descripción: Extrae componentes descriptor para un conjunto dado de puntos de interés detectados.
Entradas: Una representación de la imagen integral de una imagen, vector de puntos de interés.
Procesos: Calcula les respuestas wavelet Haar. Calcula la orientación dominante de un punto de interés. Extrae 64 - dimensional vector descriptor basado en sumas de respuestas wavelet.
Salidas: Un vector de descriptores SURF, puntos de interés.

#### Puntos de interés

Descripción: Almacena los datos asociados en cada punto de interés individual.
Entradas: Datos específicos de interés.
Procesos: métodos de acceso / mutador para datos.
Salidas: Ninguna

#### Servicios

Descripción: Módulo que contiene todas las funciones específicas no SURF.

### Otras implementaciones

| Nombre | Lenguaje | Open Source | Descripción |
| Original | C++ | No | Implementación original. |
| OpenSURF | C++, C# | Si | Implementación con la documentación detallada y documento de referencia. |
| OpenSurfCL | C++ | Si | Implementación libre de OpenSURF en OpenCL. Contenedores para C # y Java. |
| OpenCV SURF | C++ | Si | Implementación de la extracción de característicass del SURF (2,0 OpenCV). |
| SURFmex | Matlab | | Matlab Interface (MEX) a código OpenCV's SURF. |
| OpenSURF Matlab | Matlab | Si | Interfaz OpenSURF para Matlab |
| libmv SURF | C++ | Si | Implementación de extracción y comparación. |
| Python mahotas | Python | | Pac de visión para ordenador que incluye una implementación en SURF. |
| Dlib C++ Library | C++ | Si | Implementación de extracción de característicass del SURF. |
| Pan-o-matic | C++ | Si | Software que incluye una implementación del algoritmo SURF. |
| Parallel SURF (enlace roto disponible en Internet Archive; véase el historial, la primera versión y la última). | C++ | Si | Implementación Multi-threaded basada en Pan-o-matic. |
| ProcessorSURF | C# | Si | C# SURF plugin para Multi-Agent Serving System. |
| JavaSurf | Java | Si | Implementación Java para SURF |
| JOpenSURF | Java | Si | Traducción Java de OpenSURF |
| ImageJ SURF | Java | Si | Implementación SURF como ImageJ plugin con GUI con una interfaz gráfica de usuario conveniente y producción de estadísticas. |
| BoofCV | Java | Si | Librería Java de visión por ordenador Java que incluye SURF. |
| Speeded Up SURF | | Si | GPU Implementación GPU |
| CUDA SURF (enlace roto disponible en Internet Archive; véase el historial, la primera versión y la última). | C++ CUDA | Si | GPU Implementación GPU usando CUDA |
| Mathematica | Mathematica | No | Implementación matemàtica. |
| GPU SURF | | No | GPU Implementación GPU. |
| FPGA SURF Archivado el 1 de octubre de 2011 en Wayback Machine. | | Si | FPGA Implementación FPGA. |
| clsurf | C++ | | Alto rendimiento de plataforma cruzada OpenCL implementada con SURF en comparación de los vecinos más cercanos. |

## Estudios e implementaciones

* A. M. Romero and M. Cazorla, "Comparativa de detectores de característicasvisuales y su aplicación al SLAM ", X Workshop de agentes físicos, Setiembre 2009, Cáceres
* P. M. Panchal, S. R. Panchal, S. K. Shah, "A Comparison of SIFT and SURF Archivado el 21 de febrero de 2015 en Wayback Machine. ", International Journal of Innovative Research in Computer and Communication Engineering
Vol. 1, Issue 2, April 2013
* David Gossow, Peter Decker i Dietrich Paulus, "An Evaluation of Open Source SURF Implementations", Lecture Notes in Computer Science, 2011, Volume 6556/2011, 169-179
** Libraries: dlib, OpenCV, and Pan-o-Matic
* Peter Abeles, A comparison of several C/C++ and Java implementations for speed and stability. Nov. 2011
** Libraries: OpenSURF, OpenCV, Pan-o-Matic, Original, BoofCV, JavaSURF, i JOpenSURF.