Obecnie pracuję i porównuję wydajność kilku detektorów funkcji udostępnianych przez OpenCV jako podstawę wizualnego dopasowania funkcji.
Używam deskryptorów SIFT . Osiągnąłem zadowalające dopasowanie (po odrzuceniu złych dopasowań) podczas wykrywania funkcji MSER i DoG (SIFT) .
Obecnie testuję mój kod za pomocą GFTT (Good Features to Track - Harris corners), aby uzyskać porównanie, a także dlatego, że w końcowej aplikacji zestaw funkcji GFTT będzie dostępny z procesu wizualnego śledzenia funkcji.
Używam, cv::FeatureDetector::detect(...)
co zapewnia mi std::vector<cv::KeyPoint>
pełen wykrytych funkcji / kluczowych punktów / regionów zainteresowania . Struktura cv::KeyPoint
zawiera podstawowe informacje na temat lokalizacji obiektu, jak również informacje na temat size
i octave
w którym został wykryty KeyPoint.
Moje pierwsze wyniki z GFTT były okropne, dopóki nie porównałem typowych size
i octave
parametrów w różnych typach funkcji:
- MSER ustawia rozmiar (od 10 do 40 pikseli) i pozostawia oktawę na 0
- DoG (SIFT) ustawia zarówno rozmiar, jak i oktawę ( stosunek wielkości do oktawy między 20 a 40)
- GFTT parametrami są zawsze : rozmiar = 3 , oktawa = 0
Zakładam, że dzieje się tak, ponieważ głównym celem funkcji GFTT nie było używanie w dopasowywaniu, a jedynie w śledzeniu. To tłumaczy niską jakość dopasowywania wyników, ponieważ deskryptory wyodrębnione z takich drobnych funkcji przestają być dyskryminujące i niezmienne dla wielu rzeczy , w tym małych przesunięć o 1 piksel.
Gdybym ręcznie ustawić size
z GFTT do 10 - 12 , mam dobre wyniki, bardzo podobne do przypadku korzystania MSER lub Dog (przesiać) .
Moje pytanie brzmi: czy istnieje lepszy sposób na określenie, o ile można zwiększyć size
(i / lub octave
), niż po prostu iść z 10-zobaczyć-jeśli-to-działa ? Chcę uniknąć size
podwyższenia na sztywno, jeśli to możliwe, i ustalić to programowo, ale twarde kodowanie jest w porządku, o ile mam solidne argumenty potwierdzające mój wybór nowego algorytmusize
/ size
zwiększenia / size
oszacowania .
źródło
Odpowiedzi:
Nie jestem pewien, czy tak naprawdę jest dobra odpowiedź na twoje dokładne pytanie: przestrzeń SIFT i SURF w przestrzeni kosmicznej została faktycznie opracowana w celu automatycznego oszacowania „dobrego” odpowiedniego rozmiaru sąsiedztwa wokół punktu przypominającego narożnik (co jest dobrymi cechami do śledzenia są).
Teraz bardziej pozytywne odpowiedzi brzmiałyby:
zbuduj bazę danych kluczowych punktów i dobrych dopasowań (np. używając kwadratowych wzorców kalibracyjnych) i utwórz automatyczną ocenę wydajności w tej bazie danych, aby znaleźć odpowiedni rozmiar. To zadanie można naprawdę zautomatyzować (zobacz pracę Mikołajczyka i Schmida na temat oceny dopasowywania punktów)
umieść swoje dobre cechy w piramidzie obrazu, aby mieć z nimi jakąś skalę. Możesz szukać referencji na temat punktów zainteresowania w skali FAST i Harris w wielu skalach, które działają podobnie do tej procedury.
Aby heurystycznie znaleźć maksymalny rozmiar bloku, możesz obliczyć szacunki swoich zdjęć za pomocą rozmycia ramki (co mniej więcej robi operator blockSize) i zobaczyć, kiedy znika narożnik. Zauważ jednak, że więcej rozmycia zabiera kąt z jego prawdziwej lokalizacji.
Jeśli naprawdę szukasz szybkiej i brudnej poprawki, wypróbuj rozmiary od 5x5 do 11x11 (typowe rozmiary stosowane w dopasowywaniu bloków stereo). Jeśli szukasz intelektualnie spełniającego kryterium, spróbuj zmaksymalizować prawdopodobieństwo dobrego dopasowania dwóch punktów charakterystycznych poniżej poziomu hałasu.
źródło
Aby pomóc Ci określić najlepsze parametry detektorów, OpenCV ma w tym celu AjusterAdapter . Nigdy go nie użyłem, ale prawdopodobnie jest to standardowy sposób programowego określania parametrów. Należy również pamiętać, że chociaż Keypoints mają kilka właściwości, nie wszystkie mają sens dla wszystkich algorytmów. Ponieważ struktura Keypoint jest używana dla różnych algorytmów, zawiera wszystkie te pola, ale czasami nie są one używane, dlatego otrzymujesz te oktawy = 0; IMO.
źródło