2013-04-09 15 views
8

Próbuję napisać niektóre aplikacje za pomocą OpenCv4Android dla urządzeń z systemem Android. Wcześniej korzystałem z natywnych kodów Androida NDK i C++. Ale ta technika nie była zbyt klarowna. Przełączyłem się więc do najnowszej wersji interfejsu API języka Java i wersji OpenCv 2.4.4.Zamieszanie między typami danych OpenCv4Android i C++

Udało mi się napisać proste programy i uruchomić próbki. Ale, podczas gdy próbowałem napisać kilka kodów dla zaawansowanych problemów, takich jak - oszacowanie modelu POSE, procedury kalibracji aparatu itp., Natknąłem się na to bardzo dziwne zamieszanie. Niektóre typy danych, których nazwy są bardzo intuicyjne w C++ API, nie pasują do ich odpowiedników w języku Java. Stąd mam do czynienia z ogromną trudnością przeniesienia mojej funkcjonalności z C++ na Javę. Jestem stoi zupełną dezorientację w tych funkcji

  • Point2f (w C++) - MatOfPoint2f (w Javie)
  • Point3f (w C++) - MatOfPoint3f (w Javie)
  • punkt2 (w Javie)
  • Punkt3 (w języku Java)

Proszę, pomóżcie mi zrozumieć pojęcia używane w OpenCv Java i jej analogię z C++.

Ponadto, proszę zasugerować mi pewne odniesienie, gdzie, jasny i ostry opis tych terminów są podane (próbowałem oglądać pomoc dostarczoną wzdłuż, ale to mi nie pomogło, ponieważ było nieco podobne zarówno dla C++ i Java).

+1

Zadałem to samo pytanie na oficjalnym forum OpenCv. I odpowiedź została udzielona w następujący sposób. Proszę odnieść się do linku - [Zamieszanie między typami danych OpenCv4Android i C++] (http://answers.opencv.org/question/11021/confusion-between-opencv4android-and-c-data-types/) –

+2

Proponuję na przyszłe odniesienia , opublikuj odpowiedź za pomocą linku i zaakceptuj ją. W ten sposób pytanie zostanie usunięte z listy nieodebranych, a inne znajdą odpowiedź. – Mahm00d

Odpowiedz

5

Cytowanie Andrey Pawlenko:

klasy MatOfXxx (np MatOfPoint) zostały wprowadzone w celu uniknięcia nadmiarowej kopiowanie danych pośrednich między Java i natywnej pamięci. Na przykład. możesz może uzyskać duży zestaw punktów w wyniku jednej funkcji OpenCV , a następnie przekazać go do innej.

W C++ używamy do tego celu std :: vector . Ale użycie ArrayList w Javie spowodowało, że kopiuje wszystkie dane punktów z natywnego poziomu OpenCV do Javy, gdy zwraca te Punkty i kopiuje je ponownie podczas wywoływania następnej funkcji OpenCV za pomocą ich. Tak więc ze względu na wydajność zmieniliśmy na użycie klasy MatOfPoint w takich przypadkach, która jest rodzajem Mata o wartości 1n lub o wymiarach n1, które zachowują punkt w każdym elemencie (tj. Typu CV_32SC2 lub CV_64FC2).

Jak być może wiesz, Mat przechowuje wszystkie dane na poziomie natywnym , więc takie obiekty można przekazywać między wywołaniami OpenCV bez kopiowania danych. Ale jeśli w twoim kodzie Java w pewnym momencie potrzebujesz bezpośredniego dostępu do rzeczywistych danych punktów, istnieją metody toArray() i fromArray do jawnego transferu danych do/z Java.

Na przykład, aby utworzyć MatOfPoint2f zawierający punkty odpowiadające te z istniejących MatOfKeyPoint trzeba:

  • obciążenia keypoints Java poprzez MatOfKeyPoint.toArray()
  • iterację KeyPoint [] i utwórz odpowiadający punkt [] (wszystkie cv :: Point, cv :: Point2f i cv :: Point2d są reprezentowane jako org.opencv.core.Temperatura w Javie)
  • użycie MatOfPoint2f.fromArray() lub c-tor MatOfPoint2f (punkt ... PA), aby umieścić swoje punkty do natywnego poziomu

chodzi o C++ vs Java typów korespondencji:

vector<Point> : MatOfPoint 
vector<Point2f> : MatOfPoint2f 
vector<Point3i> : MatOfPoint3 
vector<Point3f> : MatOfPoint3f 
vector<KeyPoint> : MatOfKeyPoint 
vector<DMatch> : MatOfDMatch 
vector<Rect>  : MatOfRect 
vector<uchar> : MatOfByte 
vector<char>  : MatOfByte 
vector<int>  : MatOfInt 
vector<float> : MatOfFloat 
vector<double> : MatOfDouble 
vector<Vec4i> : MatOfInt4 
vector<Vec4f> : MatOfFloat4 
+0

Wysłano tę odpowiedź Andrey Pavlenko z innego forum. Jest to ważne pytanie dla kogo zaczyna się od OpenCV Java, która nie miała tutaj odpowiedzi w SO. Ustanowiłem odpowiedź jako "wiki społeczności", więc nie otrzymam przez to reputacji. –

Powiązane problemy