/ / Jak zaimplementować algorytm Sift w wymiarze 3 za pomocą opencv i c ++? - c ++, opencv, 3d, sift

Jak zaimplementować algorytm przesiewania w 3 wymiarach za pomocą opencv i c ++? - c ++, opencv, 3d, sift

Jestem zdezorientowany, jak wdrożyć przesiewaniealgorytm w 3 wymiarach przy użyciu opencv i c ++. Rozumiem zasadę algorytmu przesiewania 3D z niektórych artykułów, ale nie mam jasnego umysłu na temat implementacji. Chcę zaimplementować algorytm przy użyciu c ++ i opencv, ale nie mam pojęcia o usuwaniu struktury danych.

Algorytm przesiewania 3D można po prostu opisać jako następujące kroki:

(1) Zbuduj przestrzeń skali i wygeneruj DOG (Różnica Gaussa).

(2) Wykryj ekstrema i odfiltruj niektóre nieodpowiednie punkty kluczowe.

(3) Przypisz orientację punktów kluczowych w 3D.

(4) Wygeneruj deskryptor punktu kluczowego w 3D.

Załóżmy, że dane wejściowe 3D są gotowe i mogą być przechowywane w tablicy 3D (np. Dane podwójnego ***).

Moją pierwszą próbą jest zadeklarowanie macierzy 3D (3D Volume) przez następujące dane (dane w tablicy 3D można skopiować do macie):

int sizes[] = {x ,y, z};
Mat *Img = new Mat(3, sizes, CV_8U, Scalar(0));// using namespace cv

Potem napotykam problemy krok 1 algorytmu:

(1) Czy istnieje sposób zadeklaruj objętość 3D używając czegoś podobnego typedef, ponieważ obszar skali zawiera różne rozmiary objętości 3D. Tablica rozmiarów nie powinna być stała.

(2) Nie mogę znaleźć sposobów zmień rozmiar objętości 3D lub wykonaj filtr Gaussa dla objętości 3D. Czy rozsądne jest rozłożenie objętości 3D na plasterki 2D i wykonanie filtru zmiany rozmiaru lub Gaussa na każdym przekroju? A może istnieje jakakolwiek funkcja, która może być bezpośrednio zastosowana w objętości 3D?

Skonstruowanie odpowiedniej struktury danych powinno być kluczem algorytmu i nie mam jasnego umysłu, jak używać opencv.

Dzięki za pomoc!

Odpowiedzi:

1 dla odpowiedzi № 1

(1) Czy istnieje sposób deklarowania woluminu 3D za pomocą czegoś takiego jak typedef, ponieważ obszar skali zawiera różne rozmiary woluminu 3D. Tablica rozmiarów nie powinna być stała.

Nie, OpenCV jest skierowany głównie do obrazów 2D (pomyśl o standardowych formatach obrazu, takich jak .png, kanały wideo itp.)

(2) Nie mogę znaleźć sposobów zmiany rozmiaru 3D lubzrobić filtr Gaussa dla objętości 3D. Czy rozsądne jest rozłożenie objętości 3D na plasterki 2D i wykonanie filtru zmiany rozmiaru lub Gaussa na każdym przekroju? A może istnieje jakakolwiek funkcja, która może być bezpośrednio zastosowana w objętości 3D?

Jedyne, co naprawdę możesz zrobić z OpenCV, tomieć stos rozmiarów 2D, o różnej wielkości, jeśli chcesz. Jeśli masz wektor lub coś z zestawem mat, możesz zmienić te maty, aby pasowały do ​​twojego celu (możesz nawet zmienić rozmiar poszczególnych mat)

Mówiąc to, brzmi to tak, jakby to, co próbujesz zrobić, jest prawdopodobnie poza zakresem OpenCV. Dla odniesienia można zobaczyć implementację SIFT w OpenCV tutaj