2011-11-24 20 views
5

Próbowałem użyć cvMatchShapes(), aby dopasować dwa wzory znaczników. Jak widać na stronie Best way to count number of "White Blobs" in a Thresholded IplImage in OpenCV 2.3.0 źródłem jest słaba jakość obrazu.Poprawa dokładności dopasowania cvMatchShapes w OpenCV

Nie jestem usatysfakcjonowany wynikami uzyskanymi z tej funkcji, w większości przypadków niepoprawnymi dopasowaniami. Jak wykorzystać tę funkcję (lub jakąś odpowiednią funkcję) do skutecznego dopasowania?

Uwaga: Moim rozwiązaniem rezerwowym jest zmiana wzorca markera tak, aby miał dość duże/wyraźnie widoczne kształty. Odwiedź powyższy link, aby zobaczyć mój obecny wzór znacznika.

EDIT

znalazłem to kompleksowe porównanie różnych algorytmów detekcji cechą realizowanych w OpenCV. http://computer-vision-talks.com/2011/01/comparison-of-the-opencvs-feature-detection-algorithms-2. Według tego FAST wydaje się być dobrym wyborem.

Dałbym +1 każdemu, kto może udostępnić dobry samouczek za wdrożenie FAST (w przeciwnym razie STAR/SURF/SIFT) w OpenCV. Jestem w stanie google myśli szybko jak w prędkość :(

+0

W swojej edycji publikujesz link do różnych testów detektorów funkcji dostępnych w OpenCV. Następnie pytasz o detektor cech. W OpenCV – Sam

Odpowiedz

3

Here jest strona Szybcy wynalazcy. Stoisk szybki dla Cechy z Przyspieszony test segmentów. Here jest krótki wpis na Wikipedii oparty AST algorytmy. również here to dobry przegląd różnych detektorów fabularnych aktualnie w użyciu.

FAST faktycznie już wdrożone przez OpenCV, jeśli chcesz skorzystać z ich realizacji.

EDIT: Oto krótki przykład stworzyłem, aby pokazać, w jaki sposób korzystać z FAST czujkę:

#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; 
} 

Ten kod wyszukuje punkty fabularnych obserwacji na bliskich i dalekich zdjęć:
near imagefar image

Jak widać, bliski obraz ma wiele innych funkcji, ale wygląda na to, że ta sama podstawowa struktura jest wykrywana z odległym obrazem. Powinieneś być w stanie dopasować te. Spójrz na descriptor_extractor_matcher.cpp. To powinno ci na początek wystarczyć.

Nadzieję, że pomaga!

+0

Te algorytmy wykrywania funkcji będą działać ze słabej jakości obrazami, podobnie jak obrazy na http://stackoverflow.com/questions/8259655/best-way-to-count-number-of-white-blobs-in-a -thresholded-iplimage-in-opencv-2? – coder9

Powiązane problemy