EmguCV的solvePnPRansac期望使用哪种参数类型(显式而不是接口)?

时间:2018-11-14 13:47:10

标签: c# opencv unity3d emgucv

1)上下文

我正在使用EmguCV的Unity插件,以便从我的C#代码中调用openCV函数。更准确地说,我需要调用SolvePnPRansac方法。

以下是SolvePnPRansac方法和预期参数的文档:

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

2)问题:

该方法调用使unity编辑器本身崩溃,不留下任何异常,没有堆栈跟踪,因为尽管我的try-catch块,该插件在内部崩溃并且unity似乎无法处理它。

从统一存储的日志中,这就是我得到的,这显然表明类型不匹配:

  

Stacktrace:     在(包装器本地管理)Emgu.CV.CvInvoke.cveSolvePnPRansac(intptr,intptr,intptr,intptr,intptr,intptr,bool,int,单,双,intptr,Emgu.CV.CvEnum.SolvePnpMethod)     在(包装器本地管理)Emgu.CV.CvInvoke.cveSolvePnPRansac(intptr,intptr,intptr,intptr,intptr,intptr,bool,int,单,双,intptr,Emgu.CV.CvEnum.SolvePnpMethod)     在Emgu.CV.CvInvoke.SolvePnPRansac(Emgu.CV.IInputArray,Emgu.CV.IInputArray,Emgu.CV.IInputArray,Emgu.CV.IInputArray,Emgu.CV.IOutputArray,Emgu.CV.IOutputArray,bool,int,single ,/ Users / user / Documents / dgunity-v2 / Assets / Emgu.CV / Emgu.CV / PInvoke / CvInvokeCalib3d.cs:659中的[,double,Emgu.CV.IOutputArray,Emgu.CV.CvEnum.SolvePnpMethod)[0x00090]     在ObjectLocalization.LocalToCameraMatrixFromPnP ...

3)我尝试过的

我可以成功运行:

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

其中

  • objectPoints的类型为Emgu.CV.Util.VectorOfPoint3D32F
  • imagePoints的类型为Emgu.CV.Util.VectorOfPointF
  • cameraMatrix是Emgu.CV.Matrix类型的3X3
  • distortionCoeffs是Emgu.CV.Util.VectorOfFloat类型的1X4
  • 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是int类型的100
  • reprojectionError是float类型的8f
  • 自信度是double类型的0.99
  • inliers为Emgu.CV.Util.VectorOfInt类型的空

它只是使统一编辑器崩溃。 我在做什么错了?

1 个答案:

答案 0 :(得分:0)

无数小时的无奈之后,在这里回答我自己的问题:EmguCV期望Mat类型的参数。期间。

它公开了接口类型为iInputArray和iOutputArray的方法参数,但是实现这些接口的某些类实际上只能在某些方法中以某种组合进行处理。

因此,安全的方法是忽略其他实现所述接口的类,而只使用Mat类型;所以用

  • Empu.CV.Util.VectorOfPoint3D32F类型的objectPoints
  • Empu.CV.Util.VectorOfPointF类型的图像点
  • MAT 类型的
  • cameraMatrix 3X3 MAT
  • 类型的
  • distortionCoeffs 1X 5 MAT
  • rvec和tvec
  • 并使用inInnsnsGuess类型的bool
  • iterationsCount个类型为int的100
  • float类型的reprojectionError 8f
  • 类型为double的自信0.99
  • MAT 类型的

要在mat类型的实例中获取或设置值,必须将它们转换为图像或矩阵。我使用CopyTo和SetTo方法从Mat中获取值,并通过Cv.Matrix类型的实例将其获取到Mat中。请注意,只有SetTo(double [])对我有用。从InputArray得不到正确的处理(如果给它一个MAT,也许会,但不是我尝试使用的那些iInputArray实现)