我尝试使用OpenCV中的solvePnP(通过OpenCvSharp),但我得到了一个我不明白的例外。
An unhandled exception of type 'OpenCvSharp.OpenCVException' occurred in OpenCvSharp.dll
Additional information: src.size == dst.size && src.channels() == dst.channels()
经过一番搜索,我发现它来自convert.cpp中的cvConvertScale
以下是我如何使用它:
var objectPoints = new OpenCvSharp.CPlusPlus.Point3f[4] { o1, o2, o3, o4 };
var imagePoints = new OpenCvSharp.CPlusPlus.Point2f[4] { i1, i2, i3, i4 };
var intrinsic = new double[3, 3] { { d1, d2, d3 }, { d4, d5, d6}, { d7, d8, d9 } };
double[] rvec, tvec;
OpenCvSharp.CPlusPlus.Cv2.SolvePnP(objectPoints,
imagePoints,
intrinsic,
null, out rvec, out tvec);
如果我理解这个例外是正确的,则意味着存在转换排序,并且源和目标矩阵不具有相同大小或相同数量的通道。但是我的点数列表都是相同的。我的相机矩阵是3x3,应该没问题。我不明白。
有人可以对此有所了解吗?
答案 0 :(得分:1)
嗯,我觉得我发现了这个问题所以我会在这里发布,万一有人偶然发现这个......
我的相机矩阵似乎没有正确初始化。我不知道为什么,但我没有得到双倍[3,3]的3x3矩阵。 所以我使用OpenCV Mat构造函数初始化它,如下所示:
var intrinsic = new Mat(3, 3, MatType.CV_64F, new double[] { d1, d2, d3, d4, d5, d6, d7, d8, d9 });
现在它正在工作......如果有人知道为什么我的双[3,3]没有制作相应的Mat(3,3)随意分享!