gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 21:50:16 26 4
gpt4 key购买 nike

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

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

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);

在哪里

  • 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 为 100,类型为 int
  • reprojectionError 是 8f 类型的 float
  • confident 是 0.99 类型的 double
  • inliers 是 Emgu.CV.Util.VectorOfInt 类型的空

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

最佳答案

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

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

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

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

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

关于c# - EmguCV 的 solvePnPRansac 期望哪些参数类型(明确的,而不是接口(interface))?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53301731/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com