EmguCV 的 solvePnPRansac 期望哪些参数类型(明确的,而不是接口)?

What argument types (explicit, not interfaces) does solvePnPRansac from EmguCV expect?

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 编辑器本身崩溃,没有留下异常,没有堆栈跟踪,因为插件在内部崩溃并且 unity 似乎无法处理它,尽管我有 try-catch 块。

从统一存储的日志中,这是我得到的,这清楚地表明类型不匹配:

Stacktrace: at (wrapper managed-to-native) Emgu.CV.CvInvoke.cveSolvePnPRansac (intptr,intptr,intptr,intptr,intptr,intptr,bool,int,single,double,intptr,Emgu.CV.CvEnum.SolvePnpMethod) at (wrapper managed-to-native) Emgu.CV.CvInvoke.cveSolvePnPRansac (intptr,intptr,intptr,intptr,intptr,intptr,bool,int,single,double,intptr,Emgu.CV.CvEnum.SolvePnpMethod) at 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,double,Emgu.CV.IOutputArray,Emgu.CV.CvEnum.SolvePnpMethod) [0x00090] in /Users/user/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);

哪里

4) 什么不起作用

现在我试试:

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

哪里

它只会让统一编辑器崩溃。 我做错了什么?

在经历了无数小时的挫败之后,在这里回答我自己的问题:EmguCV 需要 Mat 类型的参数。期间.

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

所以安全的方法就是忘记其他 类 实现规定的接口,只使用 Mat 类型;所以使用

  • Emgu.CV.Util.VectorOfPoint3D32F
  • 类型的对象点
  • Emgu.CV.Util.VectorOfPointF
  • 类型的图像点
  • cameraMatrix 3X3 类型 MAT
  • 失真系数 1X 5 MAT
  • rvec 和 tvec 类型 MAT
  • 并使用 IntrinsicGuess 类型 bool
  • 迭代次数 100,类型为 int
  • reprojectionError 8f 类型为 float
  • double 类型置信度 0.99
  • MAT
  • 类型的内点

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