2013-04-09 4 views
8

Я пытаюсь написать некоторые приложения, использующие OpenCv4Android для устройств Android. Раньше я использовал собственные коды Android NDK и C++. Но эта техника была не очень ясной. Поэтому я переключился на новейший Java API, вместе с версией OpenCv 2.4.4.Путаница между типами данных OpenCv4Android и C++

Я смог написать простые программы и запустить образцы. Но, хотя я пытался написать некоторые коды для передовых проблем, таких как: оценка модели POSE, процедуры калибровки камеры и т. Д., Я столкнулся с этой очень странной путаницей. Некоторые типы данных, чьи имена очень интуитивно понятны в C++ API, действительно не вписываются в их Java-партнер. Следовательно, я столкнулся с ужасной трудностью для переноса моей функциональности с C++ на Java. Я столкнулся растерянность в этих функциях

  • Point2f (в C++) - MatOfPoint2f (в Java)
  • Point3f (в C++) - MatOfPoint3f (в Java)
  • point2 (в Java)
  • Point3 (на Java)

Пожалуйста, помогите мне понять термины, используемые в OpenCv Java и его аналогию с C++.

Кроме того, пожалуйста, предложите мне некоторую ссылку, где даны четкие и четкие описания этих терминов (я попытался просмотреть предоставленную помощь, но мне это не помогло, так как это было похоже на C++ и Java).

+1

Я задал тот же вопрос на официальном форуме OpenCv. И ответ был дан следующим образом. См. Ссылку - [Путаница между типами данных OpenCv4Android и C++] (http://answers.opencv.org/question/11021/confusion-between-opencv4android-and-c-data-types/) –

+2

Я предлагаю для будущих ссылок , вы отправляете ответ со ссылкой и принимаете его. Таким образом, вопрос будет удален из списка без ответа, а другой найдет ответ. – Mahm00d

ответ

5

Цитирование Андрей Павленко:

классы MatOfXxx (например MatOfPoint) были введены, чтобы избежать избыточного копирование промежуточных данных между Java и родной памяти. Например. вы можете получить некоторый большой набор очков в результате одной функции OpenCV , а затем передать ее другому.

В C++ мы используем std :: vector для этого. Но использование ArrayList в Java вызвало копирование всех данных точек с родного уровня OpenCV на Java, когда возвращал эти точки и копировал их при вызове следующей функции OpenCV, используя их. Таким образом, для повышения эффективности мы переключили на использование класса MatOfPoint в таких случаях, который является своего рода матрицей 1n или n1, которая сохраняет точку в каждом элементе (например, тип CV_32SC2 или CV_64FC2).

Как вы, возможно, знаете, Mat сохраняет все данные на уровне , поэтому такие объекты могут быть переданы между вызовами OpenCV без копирования данных. Но если в вашем Java-коде в какой-то момент вам нужен прямой доступ к фактическим данным Точка, существуют методы toArray() и fromArray для явного переноса данных в/из Java.

Например, чтобы создать MatOfPoint2f , содержащий точки, соответствующие те из существующих MatOfKeyPoint вам нужно:

  • нагрузки на Java ключевых точек с помощью MatOfKeyPoint.toArray()
  • перебирать KeyPoint [] и создайте соответствующую точку [] (все cv :: Point, cv :: Point2f и cv :: Point2d представлены как org.opencv.core.Точка в Java)
  • использования MatOfPoint2f.fromArray() или с-тор MatOfPoint2f (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 
+0

Написал этот ответ Андрей Павленко с другого форума. Это важный вопрос, для которого начинается OpenCV Java, который не получил ответа здесь в SO. Настроил ответ как «вики сообщества», поэтому я не получу репутацию. –

Смежные вопросы