Conceptos y principios de emparejamiento de plantillas
comparación de plantillas es encontrar en la imagen de plantilla que mejor se adapte (como) la primera parte de la imagen y.
Los pasos específicos de izquierda a derecha, la imagen plantilla de cálculo del grado de cobertura a juego con un área de la imagen de arriba a abajo, cuanto mayor sea el grado de correspondencia, mayor será la posibilidad de que los dos son lo mismo.
Darse cuenta de comparación de plantillas: función matchTemplate
void matchTemplate (imagen InputArray, InputArray temp1, resultado outputArray, método int);
- Imagen, la imagen que se debe buscar, y para una imagen de 8 bits o de 32 bits en coma flotante.
- Temp 1, plantillas de búsqueda, usted necesita el cuadro original y tener el mismo tipo de datos, y el tamaño no puede ser más grande que la imagen de origen.
- En consecuencia, resultado de la comparación de imagen asignada, que debe ser de un solo canal, las imágenes de punto flotante de 32 bits, el tamaño (image.cols - temp1.cols 1) × (image.rows - temp1.rows +1)
- método, método de coincidencia, hay seis tipos de opciones:
Matching | La fórmula |
Coincidencia de diferencia al cuadrado TM_SQDIFF |
|
Normalizado correspondiente diferencia cuadrada TM_SQDIFF_NORMED |
|
método de correlación coincidente TM_CCORR |
|
método de emparejamiento de correlación normalizado TM_CCORR_NORMED |
|
Coincidencia de coeficiente TM_CCOEFF |
entre
|
Coeficiente de correlación coincidente TM_CCOEFF_NORMED |
|
Ejemplo de código:
# include <opencv.hpp>
#include <iostream>
#include < string >
utilizando espacio de nombres std;
el uso de espacio de nombres cv;
Src Mat, temp;
int method = 0 ;
void ChangeMethod ( int , void * ) {
interruptor (método) {
caso 0 :
método = TM_SQDIFF;
romper ;
caso 1 :
método = TM_SQDIFF_NORMED;
romper ;
caso 2 :
método = TM_CCORR;
romper ;
caso 3 :
método = TM_CCORR_NORMED;
romper ;
caso 4 :
método = TM_CCOEFF;
romper ;
caso 5 :
método = TM_CCOEFF_NORMED;
romper ;
}
MAT resultar;
matchTemplate (src, temp, resultado, método);
imshow ( " resultado " , resultado);
Mat dst = src.clone ();
doble mxValue, mnValue;
Punto mxPoint, mnPoint;
minMaxLoc (resultado, y mnValue, y mxValue, y mnPoint, y mxPoint);
// https://www.cnblogs.com/bjxqmy/p/12386274.html
si (método == TM_SQDIFF || método == TM_SQDIFF_NORMED) {
rectángulo (dst, mnPoint, punto (mnPoint.x + temp.cols, mnPoint .y + temp.rows), escalar ( 0 , 0 , 255 ));
}
Demás {
rectángulo (DST, mxPoint, Point (mxPoint.x + temp.cols, mxPoint.y + temp.rows), Escalar ( 0 , 0, 255 ));
}
Imshow ( " dst " , dst);
}
Int main () {
src = imread ( " C: / Usuarios /齐明洋/Desktop/1.jpg " );
temp = imread ( " C: / Usuarios /齐明洋/Desktop/a.jpg " );
imshow ( " src " , src);
imshow ( " temp " , temp);
namedWindow ( " dst " );
createTrackbar ( " método " , "" , Y método, 5 , ChangeMethod);
ChangeMethod ( 0 , 0 );
WAITKEY ( 0 );
}
efecto de demostración:
Ilustraciones y plantillas:
método TM_SQDIFF
método TM_SQDIFF_NORMED
método TM_CCORR
método TM_CCORR_NORMED
método TM_CCOEFF
método TM_CCOEFF_NORMED
el blog de referencia: http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/imgproc/histograms/template_matching/template_matching.html
https://www.cnblogs.com/fuzhuoxin/p/12158777.html