Red de conocimiento del abogados - Bufete de abogados - ¿Cómo determina Java opencv el resultado de la coincidencia de tamizado?

¿Cómo determina Java opencv el resultado de la coincidencia de tamizado?

Sigo viendo la obra maestra SIFT de Lowe's estos días y me siento mareado y con calambres. ¡Borracho también! ! ! ! No puedo soportarlo más. Consigamos algunas cosas buenas. Sabemos que opencv tiene su propia biblioteca de detección de funciones SIFT y coincidencia MATCH, lo que nos permite hacer cosas estúpidas. Pero no es tan sencillo de utilizar en la práctica. A continuación se analizará una rutina típica de extracción y comparación de puntos de características SIFT basada en OPENCV, y se presentará en detalle el uso del algoritmo SIFT en OPENCV.

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>

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;

}