簡體   English   中英

OpenCv4Android和C ++數據類型之間的混淆

[英]Confusion between OpenCv4Android and C++ data types

我正在嘗試使用適用於Android設備的OpenCv4Android編寫一些應用程序。 之前,我使用的是Android NDK和C ++本機代碼。 但是這種技術並不是很清楚。 因此,我切換到了OpenCv 2.4.4版本附帶的最新Java API。

我能夠編寫簡單的程序並運行示例。 但是,盡管我嘗試編寫一些高級問題代碼,例如-模型姿勢估計,相機校准例程等,但遇到了這種非常奇怪的混亂。 在C ++ API中名稱非常直觀的某些數據類型實際上並不適合它們的Java對應類型。 因此,我面臨將我的功能從C ++移植到Java的巨大困難。 我在這些功能上面臨着徹底的困惑

  • Point2f(在C ++中)-MatOfPoint2f(在Java中)
  • Point3f(在C ++中)-MatOfPoint3f(在Java中)
  • Point2(在Java中)
  • Point3(在Java中)

請幫助我了解OpenCv Java中使用的術語及其與C ++的類比。

另外,請給我建議一些參考,在其中給出了這些術語的清晰明了的描述(我嘗試觀察提供的幫助,但並沒有太大幫助,因為C ++和Java都有些相似)。

引用安德烈·帕夫連科的話:

引入了MatOfXxx類(例如MatOfPoint)是為了避免Java和本機內存之間中間數據的冗余復制。 例如,作為一個OpenCV函數的結果,您可以獲得一些大的積分,然后將其傳遞給另一個。

在C ++中,我們為此使用std :: vector。 但是在Java中使用ArrayList會導致在返回這些Point時將所有Points數據從本機OpenCV級別復制到Java,並在使用它們調用下一個OpenCV函數時將它們復制回。 因此,為了提高效率,我們在這種情況下改用MatOfPoint類,這是一種尺寸為1n或n1的Mat,它在每個元素中保留一個Point(即CV_32SC2或CV_64FC2類型)。

如您所知,Mat將所有數據保留在本機級別,因此可以在OpenCV調用之間傳遞此類對象,而無需復制數據。 但是,如果在某些時候需要在Java代碼中直接訪問實際的Points數據,則可以使用toArray()和fromArray方法來顯式向Java傳輸數據或從Java傳輸數據。

例如,要創建一個MatOfPoint2f,其中包含與現有MatOfKeyPoint中的點相對應的點,您需要:

  • 通過MatOfKeyPoint.toArray()將KeyPoints加載到Java
  • 遍歷KeyPoint []並創建一個對應的Point [](所有cv :: Point,cv :: Point2f和cv :: Point2d在Java中都表示為org.opencv.core.Point)
  • 使用MatOfPoint2f.fromArray()或c-tor MatOfPoint2f(Point ... pa)將您的Point設為本機級別

至於C ++與Java類型的對應關系:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM