Какие типы аргументов (явные, а не интерфейсы) ожидают решенияstallPnPRansac от EmguCV? - PullRequest
0 голосов
/ 14 ноября 2018

1) Контекст

Я использую плагин EmguCV для Unity, чтобы вызывать функции openCV из моего кода C #.Точнее мне нужно вызвать метод SolvePnPRansac.

Вот документация для метода SolvePnPRansac и ожидаемые аргументы:

http://www.emgu.com/wiki/files/3.1.0/document/html/36ff5d6b-498a-0587-5350-370bdecf64d7.htm

2) Проблема:

Вызов метода приводит к сбою самого редактора Unity, не оставляя исключений и трассировки стека, потому что плагин внутренне падает, и Unity, похоже, не в состоянии справиться с этим, несмотря на мой try-catchblock.

из журналов, которые постоянно хранит Unity, это то, что я получаю, что явно указывает на несоответствие типов:

Stacktrace: at (обертка, управляемая в нативный) Emgu.CV.CvInvoke.cveSolvePnPRansac (intptr, intptr, intptr, intptr, intptr, intptr, bool, int, одинарный, двойной, intptr, Emgu.CV.CvEnum.SolvePnpMethod) в Emgu.C (управляемой оболочкой).CvInvoke.cveSolvePnPRansac (intptr, intptr, intptr, intptr, intptr, intptr, bool, int, одинарный, двойной, intptr, Emgu.CV.CvEnum.SolvePnpMethod) в Emgu.CV.CvInvoke.SolveguPR.CV.IInputArray, Emgu.CV.IInputArray, Emgu.CV.IInputArray, Emgu.CV.IOutputArray, Emgu.CV.IOutputArray, bool, int, одинарный, двойной, Emgu.CV.IOutputArray, Emgu.CV.CvEnum.SolvePnpMethod) [0x00090] в / Users / пользователь/Documents/dgunity-v2/Assets/Emgu.CV/Emgu.CV/PInvoke/CvInvokeCalib3d.cs:659 at ObjectLocalization.LocalToCameraMatrixFromPnP ...

3) Что я пробовал :

Я могу успешно запустить:

        CvInvoke.SolvePnP(objectPoints, imagePoints, cameraMatrix, distortionCoeffs, rvec, tvec, useIntrinsicGuess);

, где

  • objectPoints имеет тип Emgu.CV.Util.VectorOfPoint3D32F
  • imagePointsимеет тип Emgu.CV.Util.VectorOfPointF
  • cameraMatrix - 3X3 типа Emgu.CV.Matrix
  • distortionCoeffs - 1X4 типа Emgu.CV.Util.VectorOfFloat
  • rvec и tvec имеют тип Emgu.CV.Util.VectorOfFloat
  • , а useIntrinsicGuess имеет тип bool

4) Что не работает

сейчас я пытаюсь:

CvInvoke.SolvePnPRansac(ransacObjPoints, ransacImgPoints, cameraMatrix, distortionCoeffs, rvec, tvec, useIntrinsicGuess, iterationsCount, reprojectionError, confident, inliers, Emgu.CV.CvEnum.SolvePnpMethod.Iterative);

где

  • iterationsCount равен 100 типа int
  • reprojectionError равен 8f типа float
  • cЗначение onfident равно 0,99 типа double
  • . Пустые значения типа Emgu.CV.Util.VectorOfInt

. Это просто приводит к сбою редактора единиц.Что я делаю не так?

1 Ответ

0 голосов
/ 11 декабря 2018

Отвечая на мой собственный вопрос здесь после бесчисленных часов разочарования: EmguCV ожидает аргументы типа Mat.Period.

Он предоставляет аргументы методов типов интерфейсов iInputArray и iOutputArray, но некоторые классы, реализующие эти интерфейсы, могут действительно обрабатываться только в некоторых комбинациях в некоторых методах.

Таким образом, безопасный способпросто забыть о других классах, реализующих указанный интерфейс, и просто перейти к типу Mat;поэтому используйте

  • objectPoints типа Emgu.CV.Util.VectorOfPoint3D32F
  • imagePoints типа Emgu.CV.Util.VectorOfPointF
  • cameraMatrix 3X3 типа MAT
  • distortionCoeffs 1X 5 типа MAT
  • rvec и tvec типа MAT
  • и useIntrinsicGuess тип bool
  • iterationsCount 100 типа int
  • reprojectionError 8f типа float
  • уверенный 0,99 типа double
  • Inliers типа MAT

Чтобы получить или установить значения в ваших экземплярах типа mat, вы должны преобразовать их в изображения или матрицы.Я использовал методы CopyTo и SetTo для получения значений из Mat и в Mat через экземпляры типа Cv.Matrix.Имейте в виду, что только SetTo (double []) работал для меня.Из InputArray не обрабатывается должным образом (если вы дадите ему MAT, может быть, но не те реализации iInputArray, которые я пытался использовать)

...