opencv viene con un algoritmo de coincidencia de plantillas listo para usar.
Rutina para la comparación de imágenes usando la biblioteca SIFT en OPENCV
// opencv_empty_proj.cpp: define el punto de entrada de la aplicación de consola.
//
#include "stdafx.h"
#include
#include #include #include # incluir usando el espacio de nombres std; usando el espacio de nombres cv; int _tmain(int argc, _TCHAR* argv[]) { const char* imagename = "img.jpg" ) //Leer imagen del archivo Mat img = imread(imagename) ; Mat img2 = imread("img2.jpg"); //Si falla la lectura de la imagen if( img. vacío()) { fprintf(stderr, "No se puede cargar la imagen %s\n", imagename); return -1; p> } if(img2.empty()) { fprintf( stderr, "No se puede cargar la imagen %s\ n" , nombreimagen); return -1; } //muestra la imagen imshow("imagen antes", img imshow(" imagen2 antes", img2 /Detección de funciones de filtro SiftFeatureDetector siftdtc; vector siftdtc.detect( img,kp1) ; Mat outimg1; drawKeypoints(img,kp1,outimg1); imshow("image1 keypoints",outimg1); KeyPoint kp; vector for(itvc=kp1.begin();itvc!=kp1.end();itvc++) p> { cout<< "ángulo:"<& lt;itvc->ángulo<<"\t"< } siftdtc.detect(img2,kp2 );< /p> Mat outimg2; drawKeypoints(img2,kp2, outimg2); imshow("image2 keypoints",outimg2); SiftDescriptorExtractor Extractor; Mat descriptor1,descriptor2; BruteForceMatcher vector Mat img_matches; extractor.compute(img,kp1,descriptor1); extractor.compute(img2,kp2,descriptor2); imshow(" desc ",descriptor1); cout< drawMatches(img,kp1,img2,kp2,matches,img_matches); imshow("matches",img_matches); //Esta función espera a que se presione una tecla y regresa cuando se presiona cualquier tecla en el teclado waitKey ( ); devuelve 0; }