2015-03-19 133 views
1

我想从OpenCV(通过OpenCvSharp)使用solvePnP,但我得到了一个我不明白的异常。在OpenCV调用cvConvertScale中的异常solvePnP

An unhandled exception of type 'OpenCvSharp.OpenCVException' occurred in OpenCvSharp.dll 
Additional information: src.size == dst.size && src.channels() == dst.channels() 

经过一番搜索,我发现它来自cvConvertScale在convert.cpp

这是我如何使用它:

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,应该没问题。我不明白。

有人可以对此有所了解吗?

回答

1

嗯,我想我找到了问题,所以我会在这里万一有人张贴偶然发现这个...

看来我的相机矩阵是不正确初始化。我不知道为什么,但我没有从我的double [3,3]获得3x3矩阵。

var intrinsic = new Mat(3, 3, MatType.CV_64F, new double[] { d1, d2, d3, d4, d5, d6, d7, d8, d9 }); 

而现在它的工作......如果有谁知道为什么我的双[3,3]没有产生相应垫(3,3)的感受: 所以我使用OpenCV的垫构造这样的初始化,它免费分享!