matrices library copyto convertto opencv image-processing data-structures surf

copyto - opencv mat library



OpenCV/SURF ¿Cómo generar una imagen hash/huella digital/firma de los descriptores? (4)

Los datos de las funciones que mencione (posición, laplacian, tamaño, orientación, arpillera) no son suficientes para su propósito (en realidad, son las partes menos relevantes del descriptor si desea hacer el emparejamiento). Los datos que desea ver son los "descriptores" (el cuarto argumento):

void cvExtractSURF (const CvArr * image, const CvArr * mask, CvSeq ** keypoints, CvSeq ** descriptors, CvMemStorage * storage, CvSURFParams params)

Estos son 128 o 64 vectores (que dependen de parámetros) que contienen las "huellas dactilares" de la característica específica (cada imagen contendrá una cantidad variable de dichos vectores). Si obtienes la última versión de Opencv, tienen una muestra llamada find_obj.cpp que muestra cómo se usa para hacer coincidir

actualización :

es posible que encuentre útil this discusión

Aquí hay algunos temas que son muy útiles sobre cómo encontrar imágenes similares.

Lo que quiero hacer es obtener una huella digital de una imagen y encontrar la misma imagen en diferentes fotos tomadas por una cámara digital. El algoritmo de SURF parece ser la mejor manera de ser independiente en escala, ángulo y otras distorsiones.

Estoy usando OpenCV con el algoritmo SURF para extraer características en la imagen de muestra. Ahora me pregunto cómo convertir todos estos datos de funciones (posición, laplacian, tamaño, orientación, arpillera) en una huella digital o hash.

Esta huella digital se almacenará en una base de datos y una consulta de búsqueda debe poder comparar esa huella digital con una huella digital de una foto con casi las mismas características.

Actualizar:

Parece que no hay forma de convertir todos los vectores descriptores en un simple hash. Entonces, ¿cuál sería la mejor manera de almacenar los descriptores de imagen en la base de datos para consultas rápidas?

¿Serán los árboles de vocabulario una opción?

Estaría muy agradecido por cualquier ayuda.



Una forma trivial de calcular un hash sería la siguiente. Obtenga todos los descriptores de la imagen (por ejemplo, N de ellos). Cada descriptor es un vector de 128 números (puede convertirlos en enteros entre 0 y 255). Entonces tienes un conjunto de enteros N * 128. Simplemente escríbalos uno tras otro en una cadena y utilízalo como un valor hash. Si desea que los valores hash sean pequeños, creo que hay formas de calcular las funciones hash de cadenas, así que convierta descriptores a cadena y luego use el valor hash de esa cadena.

Eso podría funcionar si quieres encontrar duplicados exactos. Pero parece (ya que habla de escala, rotación, etc.) que desea simplemente encontrar imágenes "similares". En ese caso, usar un hash probablemente no sea una buena forma de hacerlo. Probablemente use algún detector de puntos de interés para encontrar puntos en los que calcular los descriptores de SURF. Imagine que devolverá el mismo conjunto de puntos, pero en diferente orden. De repente, su valor de hash será muy diferente, incluso si las imágenes y los descriptores son los mismos.

Entonces, si tuviera que encontrar imágenes similares de manera confiable, utilizaría un enfoque diferente. Por ejemplo, podría cuantificar vectores los descriptores de SURF, construir histogramas de valores cuantificados de vectores y usar la intersección de histogramas para hacer correspondencias. ¿De verdad tienes que usar funciones hash (tal vez por eficiencia), o solo quieres usar lo que sea para encontrar imágenes similares?


Min-Hash o min-Hashing es una técnica que podría ayudarte. Codifica la imagen completa en una representación con tamaño ajustable que luego se almacena en tablas hash. Existen varias variantes, como Mín-Hashing geométrico, Part-min min-Hash y Bundle min-Hashing . La huella de memoria resultante no es una de las más pequeñas, pero estas técnicas funcionan para una variedad de escenarios, como la recuperación casi duplicada e incluso la recuperación de objetos pequeños, un escenario donde otras firmas cortas a menudo no funcionan muy bien.

Hay varios trabajos sobre este tema. La literatura de entrada sería: Detección de imágenes casi duplicadas: min-Hash y tf-idf Ponderación Ondrej Chum, James Philbin, Andrew Zisserman, BMVC 2008 PDF