2013-04-09 19 views
8

Android cihazlar için OpenCv4Android'i kullanarak bazı uygulamalar yazmaya çalışıyorum. Daha önce Android NDK ve C++ yerel kodlarını kullanıyordum. Ama bu teknik çok berrak değildi. Bu yüzden OpenCv 2.4.4 sürümü ile birlikte gelen en son Java API'ye geçtim.OpenCv4Android ve C++ veri türleri arasındaki karışıklık

Basit programlar yazıp örnekleri çalıştırabildim. Ancak, Model POSE tahmini, Kamera kalibrasyon rutinleri vb. Gibi gelişmiş problemler için bazı kodlar yazmaya çalışırken bu garip karmaşaya rastladım. C++ API'da isimleri çok sezgisel olan bazı veri türleri, Java karşılıklarına tam olarak uymuyor. Bu nedenle, C++ 'dan Java'ya işlevselliğimi aktarmak için büyük bir zorluk yaşıyorum. Ben bu fonksiyonların (C++)

  • Point2f içinde mutlak karışıklığı karşı karşıya am - MatOfPoint2f (C++)
  • Point3f (Java) - MatOfPoint3f (Java)
  • Nokta2'nin (Java)
  • Point3 (Java)

Lütfen OpenCv Java'da kullanılan terimleri ve C++ ile benzetimini anlamama yardımcı olun.

Ayrıca, bu terimlerin açık ve net açıklamalarının verildiği bazı referansları da belirtiniz (birlikte verilen yardımı izlemeyi denedim, ancak C++ ve Java için biraz benzer olduğu için bana çok yardımcı olmadı.). Andrey Pavlenko teklif

+1

Aynı soruyu resmi OpenCv Forumunda da sordum. Ve aşağıdaki şekilde cevaplandı. Lütfen bağlantıya bakın - [OpenCv4Android ve C++ veri türleri arasındaki karışıklık] (http://answers.opencv.org/question/11021/confusion-between-opencv4android-and-c-data-types/) –

+2

Gelecekteki referanslar için önerim cevabı link ile gönderiyor ve kabul ediyorsunuz. Bu şekilde, soru cevapsız listeden kaldırılacak ve diğer cevapları bulacaktır. – Mahm00d

cevap

5

:

MatOfXxx sınıfları (örneğin, MatOfPoint) Java ve doğal bellek arasındaki ara veri gereksiz kopyalanmasını önlemek için yapılmıştır. Örneğin. , bir OpenCV işlevi 'un sonucu olarak büyük bir Nokta kümesi alabilir ve ardından diğerine iletebilir.

C++'da bunun için std :: vector kullanıyoruz. Ancak Java'da ArrayList kullanımı, bu Noktaları döndürürken ve bunları kullanarak bir sonraki OpenCV işlevini çağırarak geri kopyalarken, tüm Points verilerini yerel OpenCV düzeyinden Java'ya kopyalayarak 'un kullanılmasına neden oldu. Bu nedenle, verimlilik açısından, MatOfPoint sınıfının MatOfPoint sınıfının kullanımına, her bir öğede bir Noktayı (örneğin, CV_32SC2 veya CV_64FC2) tutan 1n veya n1 boyutlarında bir Mat türü olarak kullanın.

Bildiğiniz gibi, Mat, yerel düzeyindeki tüm verileri saklar; böylece, veri kopyalama olmadan OpenCV çağrıları arasında geçirilebilir. Fakat eğer Java kodunuzda bir noktaya gerçek Nokta verisine doğrudan erişmeniz gerekiyorsa, Java'ya/dan açık bir şekilde aktarım verisi için toArray() ve fromArray yöntemleri vardır.

Örneğin, bir MatOfPoint2f MatOfKeyPoint mevcut olanlardan tekabül eden noktaları içeren oluşturmak için gereken: Java

  • yük keypoints MatOfKeyPoint.toArray() Keypoint [] ve içinden
  • yineleme ile karşılık gelen bir Nokta [] (tüm cv :: Nokta, cv :: Nokta2f ve cv :: Nokta2d, org.opencv.core olarak temsil edilir.Java Noktası)
  • yerli düzeyde Java tipleri yazışma vs C++ gelince

için Noktalar koymak

  • kullanım MatOfPoint2f.fromArray() veya c-tor MatOfPoint2f (Nokta ... pa):

  • 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

    Bu cevap gönderdi Andrey Pavlenko'nun başka bir forumdan. Bu, SO'da bir cevabı olmayan OpenCV Java ile kimler için önemli bir sorudur. Cevabı "topluluk wiki'si" olarak yerleştirdim, bu yüzden buna itibar etmeyeceğim. –

    İlgili konular