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);
其中
4)什么不起作用
现在我尝试:
CvInvoke.SolvePnPRansac(ransacObjPoints, ransacImgPoints, cameraMatrix, distortionCoeffs, rvec, tvec, useIntrinsicGuess, iterationsCount, reprojectionError, confident, inliers, Emgu.CV.CvEnum.SolvePnpMethod.Iterative);
其中
它只是使统一编辑器崩溃。 我在做什么错了?
答案 0 :(得分:0)
无数小时的无奈之后,在这里回答我自己的问题:EmguCV期望Mat类型的参数。期间。
它公开了接口类型为iInputArray和iOutputArray的方法参数,但是实现这些接口的某些类实际上只能在某些方法中以某种组合进行处理。
因此,安全的方法是忽略其他实现所述接口的类,而只使用Mat类型;所以用
要在mat类型的实例中获取或设置值,必须将它们转换为图像或矩阵。我使用CopyTo和SetTo方法从Mat中获取值,并通过Cv.Matrix类型的实例将其获取到Mat中。请注意,只有SetTo(double [])对我有用。从InputArray得不到正确的处理(如果给它一个MAT,也许会,但不是我尝试使用的那些iInputArray实现)