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);
哪里
- 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 是 double 类型的 0.99
- inliers 是 Emgu.CV.Util.VectorOfInt
类型的空
它只会让统一编辑器崩溃。
我做错了什么?
在经历了无数小时的挫败之后,在这里回答我自己的问题: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 的那些实现)
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);
哪里
- 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 是 double 类型的 0.99
- inliers 是 Emgu.CV.Util.VectorOfInt 类型的空
它只会让统一编辑器崩溃。 我做错了什么?
在经历了无数小时的挫败之后,在这里回答我自己的问题: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 的那些实现)