2011-11-24 16 views
5

He intentado usar cvMatchShapes() para que coincida con dos patrones de marcador. Como puede ver en Best way to count number of "White Blobs" in a Thresholded IplImage in OpenCV 2.3.0, la fuente tiene una mala calidad de imagen.Mejore la precisión de coincidencia de cvMatchShapes en OpenCV

No estoy satisfecho con los resultados devueltos por esa función, la mayoría de las veces da coincidencias incorrectas. ¿Cómo usar esta función (o alguna función adecuada) para hacer un emparejamiento efectivo?

Nota: Mi solución alternativa es cambiar el patrón de marcador para que tenga formas bastante grandes/claramente visibles. Por favor, visite el enlace de arriba para ver mi patrón de marcador actual.

EDITAR

Me encontraron esta comparación exhaustiva de diversos algoritmos de detección característica implementada en OpenCV. http://computer-vision-talks.com/2011/01/comparison-of-the-opencvs-feature-detection-algorithms-2. Según eso, FAST parece ser una buena opción.

Daría +1 a cualquiera que pueda compartir un buen tutorial para implementar FAST (más STAR/SURF/SIFT) en OpenCV. Soy incapaz de google piensa rápido como en la velocidad :(

+0

En su edición, publica un enlace a varias pruebas de detectores de funciones disponibles en OpenCV. Luego pides un detector de funciones. En OpenCV – Sam

Respuesta

3

Here es el sitio web del inventor RÁPIDO. Fast representa Características de test de segmentos acelerado. Here es una breve entrada de Wikipedia sobre AST basada algoritmos. Además, here es un buen estudio de los diferentes detectores de características actualmente en uso hoy en día.

FAST es en realidad ya aplicadas por OpenCV si desea utilizar su aplicación.

EDIT: Aquí es breve ejemplo que he creado para mostrar cómo utilizar el detector rápido:

#include <opencv2/core/core.hpp> 
#include <opencv2/highgui/highgui.hpp> 
#include <opencv2/imgproc/imgproc.hpp> 
#include <opencv2/features2d/features2d.hpp> 
#include <vector> 

using namespace std; 
using namespace cv; 

int main(int argc, char* argv[]) 
{ 
    Mat far = imread("far.jpg", 0); 
    Mat near = imread("near.jpg", 0); 

    Ptr<FeatureDetector> detector = FeatureDetector::create("FAST"); 

    vector<KeyPoint> farPoints; 
    detector->detect(far, farPoints); 

    Mat farColor; 
    cvtColor(far, farColor, CV_GRAY2BGR); 
    drawKeypoints(farColor, farPoints, farColor, Scalar(255, 0, 0), DrawMatchesFlags::DRAW_OVER_OUTIMG); 
    imshow("farColor", farColor); 
    imwrite("farPoints.jpg", farColor); 

    vector<KeyPoint> nearPoints; 
    detector->detect(near, nearPoints); 

    Mat nearColor; 
    cvtColor(near, nearColor, CV_GRAY2BGR); 
    drawKeypoints(nearColor, nearPoints, nearColor, Scalar(0, 255, 0), DrawMatchesFlags::DRAW_OVER_OUTIMG); 
    imshow("nearColor", nearColor); 
    imwrite("nearPoints.jpg", nearColor); 

    waitKey(); 
    return 0; 
} 

Este código se encuentra los puntos de función de seguimiento de la imaginería lejos y de cerca:
near imagefar image

Como puede ver, la imagen cercana tiene muchas más características, pero parece que se detecta la misma estructura básica con la imagen lejana. Entonces, deberías poder hacer coincidir estos. Eche un vistazo al descriptor_extractor_matcher.cpp. Eso debería hacerte comenzar.

Espero que ayude!

+0

¿Funcionarán estos algoritmos de detección de funciones con imágenes de mala calidad y también las imágenes en http://stackoverflow.com/questions/8259655/best-way-to-count-number-of-white-blobs-in-a -thresholded-iplimage-in-opencv-2? – coder9

Cuestiones relacionadas