代码之家  ›  专栏  ›  技术社区  ›  Daveloper

EmguCV中的solvePnPRansac期望什么参数类型(显式,而不是接口)?

  •  2
  • Daveloper  · 技术社区  · 7 年前

    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块。

    堆栈跟踪: at(包装器管理为本机)Emgu.CV.CvInvoke.cveSolvePnPRansac(intptr、intptr、intptr、intptr、intptr、bool、int、single、double、intptr、Emgu.CV.CvEnum.SolvePnpMethod) 在ObjectLocalization.LocalToCameraTrixFrompnp。。。

    :

    我可以成功运行:

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

    • objectPoints的类型为Emgu.CV.Util.VectorOfPoint3D32F
    • imagePoints的类型为Emgu.CV.Util.VectorOfPointF
    • 扭曲效应是Emgu.CV.Util.VectorOffload类型的1X4
    • 而useIntrinsicGuess是bool类型

    现在我试着:

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

    哪里

    • IterationCount是int类型的100
    • 自信是0.99的双精度类型
    • Inliner为空,类型为Emgu.CV.Util.VectorOfInt

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

    1 回复  |  直到 7 年前
        1
  •  0
  •   Daveloper    7 年前

    在经历了无数个小时的挫折之后,我在这里回答了我自己的问题:EmguCV期望Mat类型的参数。时期

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

    • Emgu.CV.Util.VectorOfPoint3D32F类型的objectPoints
    • cameraMatrix 3X3型 垫子
    • 5. 类型 垫子
    • 类型的rvec和tvec
    • 并使用intrinsicguess类型bool
    • int类型的迭代计数100
    • 浮子型重射器8f
    • 双精度0.99
    • 类型的内联线 垫子

    要在mat类型的实例中获取或设置值,必须将它们转换为图像或矩阵。我使用CopyTo和SetTo方法通过Cv.Matrix类型的实例将值从Mat中取出并放入Mat中。请注意,只有SetTo(双[])对我有效。来自输入阵列的数据没有得到正确处理(如果你给它一个MAT,它可能会得到,但不是我尝试使用的iInputArray的那些实现)