¿Cómo determina Java opencv el resultado de la coincidencia de tamizado?
El proceso general de extracción y coincidencia de puntos característicos SIFT en OPENCV es el siguiente:
Leer la imagen-detección de puntos característicos (posición, ángulo, capa)-extraer la descripción del punto característico ( Pantalla de coincidencia de vector propio de 16*8 dimensiones.
Entre ellos, hay dos pasos principales para extraer puntos característicos; consulte la subsección amarilla ascendente. Analicémoslo en detalle.
1. Utilice la biblioteca integrada opencv para leer dos imágenes.
2. Genere un objeto SiftFeatureDetector, que como su nombre indica es un detector de características SIFT. Úselo para detectar las características de los puntos SIFT en imágenes de ropa y guárdelo en un vector de tipo KeyPoint. Es necesario hablar aquí sobre la estructura de datos del punto clave, que implica mucho. Para un análisis detallado, consulte el análisis de la estructura de datos del punto clave en opencv. Lo dijo con bastante detalle (la tabla me supera... En resumen, el punto más importante es:
Puntos clave Solo algunos). Se conserva la información básica de los puntos característicos detectados por la biblioteca Sift de opencv, y los vectores de características extraídos por Sift no se encuentran entre ellos. SiftDescriptorExtractor extrae vectores de características y almacena los resultados en la estructura de datos Mat. Esta estructura de datos realmente conserva el vector de características correspondiente a este punto de característica. Consulte la descripción detallada de los objetos generados por SiftDescriptorExtractor más adelante.
Perdí toda una mañana sólo porque no entendía esto. ¡Llora hasta morir!
3. Extraiga los vectores de características de todos los puntos clave en la imagen:
Los puntos clave solo tienen la posición y dirección de los puntos clave, pero no tienen vectores de características de los puntos de característica. . Si desea extraer vectores de características, debe realizar el trabajo de SiftDescriptorExtractor. Después de establecer el objeto SiftDescriptorExtractor, puede recorrer los puntos característicos generados por SIFT antes y encontrar el vector de características de 128 dimensiones correspondiente al punto característico. Para conocer métodos específicos, consulte el análisis simple de la extracción de vectores de características SIFT realizado por SIFTDescriptor en opencv. Después de este paso, los vectores de características de todos los puntos clave se guardan como características en la estructura de datos MAT.
4. Haga coincidir los vectores de características de las dos imágenes para obtener el valor coincidente.
Después de extraer los vectores de características de las dos imágenes, podemos usar el objeto BruteForceMatcher para hacer coincidir los descriptores de las dos imágenes y hacer coincidir los resultados coincidentes. El método de coincidencia específico no se ha estudiado en detalle por el momento y se agregará más adelante.
En este punto, Sift ha completado la detección de puntos característicos hasta la coincidencia final. Aunque no sé mucho sobre la parte coincidente, solo tengo cierta comprensión de cómo usar OPENCV para extraer funciones SIFT. A continuación, podemos comenzar el siguiente paso.
Adjunto: Rutina para la comparación de imágenes usando la biblioteca SIFT en OPENCV.
1
2
Tres
Cuatro
Cinco
Seis p>
p>
Siete
Ocho
Nueve
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
p>32
33
34
35
36
37
38
39
40
41
Cuarenta y dos
43
Cuarenta y cuatro
45
46
47
48
Cuarenta y nueve
50
51
Cincuenta y dos
53
54
55
Cincuenta y seis años
57
58
59
60
61
62
63
64
65
66
67
Sesenta y ocho
Sesenta y nueve
70
71
Setenta- dos
73
74
75
76
77
Setenta- ocho
// opencv_empty_proj.cpp: define el punto de entrada de la aplicación de consola.
//
#Incluir " stdafx.h "
# incluir opencv.hpp & gt
# incluir características 2d/características 2d . HPP y gt;
# incluye no gratuito/no gratuito .
# incluye elegacy/legacy . Incluir
Usar espacio de nombres std
Usar espacio de nombres cv;
int _tmain(int argc, _TCHAR* argv[])
{
const char * imagename = " img.jpg
//Leer la imagen del archivo
mat img = im read(imagename);
p>mat img 2 = im read(" img 2 . jpg ");
//Si falla la lectura de la imagen,
if(img.empty())
{
fprintf(stderr, "No se puede cargar la imagen %s\n", imagename
return-1; > }
if(img2.empty())
{
fprintf(stderr, "No se puede cargar la imagen %s\n ", imagename);
p>
return-1;
}
//Mostrar imagen
imshow("imagen anterior", img );
imshow("image2 before ", img 2);
//detección de funciones de tamizado
SiftFeatureDetector
vectorkp1, kp2
siftdtc.detect(img, KP 1);
mat outimg 1
drawKeypoints(img, kp1, outimg 1); p>imshow("imagen1 puntos clave ", outimg 1);
Punto clave KP;
vector::itvc
for(itvc = KP 1. comenzar (); = KP 1 . t " & ltoctave & lt& lt" \ t " & ltpt & lt& lt" \ t " & ltresponse & lt& ltendl
}
siftdtc.detect(img2, kp2 );
Mat outimg2
Dibujar puntos clave (img2, kp2, outi mg 2);
imshow("Imagen 2 puntos clave", outi mg 2);
Extractor;
Mat descriptor1, descriptor2
BruteForceMatcher & ltL2 & gt; matcher
Coincidencia de vectores;
Mat img _ coincide
extractor.compute(img, kp1, descriptor 1);
extractor.compute(img2, kp2, descriptor 2);
imshow ("desc ", descriptor 1);
cout & lt& ltendl & lt& ltdescriptor 1 & lt;& ltendl
matcher.match(descriptor 1, descriptor 2, coincidencias);
drawMatches(img, kp1, img2, kp2, Coincidencias, img _ coincidencias);
imshow ("coincidencias", img _ coincidencias
// Esta función espera una tecla y luego regresa presionando cualquier tecla del teclado.
tecla de espera();
Devuelve 0;
}