调用 solvePnP 的 OpenCV 中的 cvConvertScale 异常

Exception in cvConvertScale in OpenCV calling solvePnP

我正在尝试使用 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,应该没问题。没看懂。

有人能解释一下吗?

好吧,我想我找到了问题所以我会 post 在这里以防万一有人偶然发现这个...

看来我的相机矩阵没有正确初始化。我不知道为什么,但我没有从我的 double[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),请随时分享!