c++ opencv computer-vision surf object-detection

c++ - OpenCV-Coincidencia de objetos usando descriptores SURF y BruteForceMatcher



computer-vision object-detection (3)

Tengo una pregunta sobre los objetos que coinciden con OpenCV. Estoy utilizando el algoritmo SURF implementado en opencv 2.3 para detectar primero las características de cada imagen y luego extraer los descriptores de estas características. El problema de la coincidencia con Brute Force Matcher, no sé cómo juzgo si las dos imágenes coinciden o no, es como cuando uso dos imágenes diferentes, ¡hay líneas entre los descriptores en las dos imágenes!

Estas salidas de mi código, cualquiera de las dos imágenes (comparadas con ellas) son similares o diferentes, la imagen del resultado indica que las dos imágenes coinciden.

La pregunta es: ¿Cómo puedo distinguir entre las dos imágenes?

Verdadera coincidencia:

Falsa coincidencia !! :

Mi código:

Mat image1, outImg1, image2, outImg2; // vector of keypoints vector<KeyPoint> keypoints1, keypoints2; // Read input images image1 = imread("C://Google-Logo.jpg",0); image2 = imread("C://Alex_Eng.jpg",0); SurfFeatureDetector surf(2500); surf.detect(image1, keypoints1); surf.detect(image2, keypoints2); drawKeypoints(image1, keypoints1, outImg1, Scalar(255,255,255), DrawMatchesFlags::DRAW_RICH_KEYPOINTS); drawKeypoints(image2, keypoints2, outImg2, Scalar(255,255,255), DrawMatchesFlags::DRAW_RICH_KEYPOINTS); namedWindow("SURF detector img1"); imshow("SURF detector img1", outImg1); namedWindow("SURF detector img2"); imshow("SURF detector img2", outImg2); SurfDescriptorExtractor surfDesc; Mat descriptors1, descriptors2; surfDesc.compute(image1, keypoints1, descriptors1); surfDesc.compute(image2, keypoints2, descriptors2); BruteForceMatcher<L2<float>> matcher; vector<DMatch> matches; matcher.match(descriptors1,descriptors2, matches); nth_element(matches.begin(), matches.begin()+24, matches.end()); matches.erase(matches.begin()+25, matches.end()); Mat imageMatches; drawMatches(image1, keypoints1, image2, keypoints2, matches, imageMatches, Scalar(255,255,255)); namedWindow("Matched"); imshow("Matched", imageMatches); cv::waitKey(); return 0;


El problema fue al usar Brute Force Matcher solo, encontré métodos para obtener un conjunto de buenas coincidencias entre dos vistas en "Libro de cocina de programación de aplicaciones de visión de computadora OpenCV 2"

Ch9: emparejando imágenes usando consenso de muestra aleatoria

Están utilizando K-Vecino más cercano y RANSAC

Y gracias


Necesitas modificar tu Hessian, 2500 es demasiado. Intente 50. Cuando usa una gran arpillera, el resultado es una gran cantidad de puntos clave, que resultan innecesarios. Otra información sobre SURF es que su marcador debe ser más rico, con más detalles.


Para eliminar los valores atípicos, la homografía de RANSAC + es un buen método para comparar dos imágenes planas.

La homografía es el modelo que RANSAC intentará usar para comparar puntos de ambas imágenes y encontrará el mejor conjunto de puntos que mejor se ajuste al modelo de proyección de la homografía (la transformación de un plano a otro).

cv::findHomography(srcPoints,dstPoints, RANSAC, status);

La función anterior devolverá un estado de matriz que tiene un 1 para los índices considerados como inliers y 0 para los que se consideran valores atípicos, por lo que puede eliminar los valores atípicos marcando esta matriz de estado.