Intereting Posts
Как установить растровое изображение в фоновом режиме для просмотра Android API 10-18? Анимация свойства weightSum с помощью ObjectAnimator Изменение цвета переднего и заднего фона фрагмента автозаполнения места Кэш зависимостей Android Gradle может быть поврежден и не работает. Настроить adb на Mac OS X Центрировать несколько элементов в RelativeLayout, не помещая их в контейнер? Как я могу определить, открыт или закрыт выбор метода ввода? Невозможно нажать на элементы в ListView с помощью настраиваемого адаптера Как вызвать startactivityforresult из класса non-activity для получения результатов Получение программной плотности экрана в андроиде? Как создать предпочтение, которое принимает только целочисленные значения Trace: requestLayout () неправильно вызван? Удалить вертикальную прокладку из горизонтального ProgressBar Загрузите файл через HTTP-форму через MultipartEntityBuilder с индикатором выполнения AudioTrack – как узнать, когда начинается / заканчивается звук?

Путаница между типами данных OpenCv4Android и C ++

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

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

  • Point2f (в C ++) – MatOfPoint2f (в Java)
  • Point3f (в C ++) – MatOfPoint3f (в Java)
  • Point2 (на Java)
  • Point3 (на Java)

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

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

Solutions Collecting From Web of "Путаница между типами данных OpenCv4Android и C ++"

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

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

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

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

Например, для создания MatOfPoint2f, содержащего точки, соответствующие тем из существующего MatOfKeyPoint, вам нужно:

  • Загрузить KeyPoints в Java через MatOfKeyPoint.toArray ()
  • Итерации через KeyPoint [] и создания соответствующей точки [] (все cv :: Point, cv :: Point2f и cv :: Point2d представлены как org.opencv.core.Point в Java)
  • Используйте MatOfPoint2f.fromArray () или c-tor MatOfPoint2f (Point … pa), чтобы поместить свои очки в исходный уровень

Что касается соответствия C ++ vs 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