Python openCV 2.4.3 cv2.SolvePnP 错误
我刚开始学习Python、OpenCV和Numpy。我正在尝试把一段C++代码用Python实现,这段代码是用来确定相机相对于一个已知标记的位置和姿态的。代码中用到了cv2.SolvePnP这个函数,但我一直搞不定它。虽然我在网上查了很多资料,但发现大家对这个函数的困惑都差不多。无论我怎么传递我的数据,这个函数似乎都不满意。我现在用的测试案例是:
## target image points
tPoints = np.zeros((4,2),dtype=np.float64)
tPoints[0,0] = 384.3331
tPoints[0,1] = 162.23618
tPoints[1,0] = 385.27521
tPoints[1,1] = 135.21503
tPoints[2,0] = 409.36746
tPoints[2,1] = 165.64435
## actual marker point set
mPoints = np.zeros((4,3),dtype=np.float64)
mPoints[0,0] = -88.0
mPoints[0,1] = 88.0
mPoints[0,2] = 0
mPoints[1,0] = -88.0
mPoints[1,1] = -88.0
mPoints[1,2] = 0
mPoints[2,0] = 88.0
mPoints[2,1] = -88.0
mPoints[2,2] = 0
mPoints[3,0] = 88.0
mPoints[3,1] = 88.0
mPoints[3,2] = 0
camMatrix = np.zeros((3,3),dtype=np.float64 )
camMatrix[0][0] = 519.0
camMatrix[0][2] = 320.0
camMatrix[1][1] = 522.0
camMatrix[1][2] = 240.0
camMatrix[2][2] = 1.0
retval, rvec, tvec = cv2.solvePnP(objectPoints = tPoints, imagePoints = mPoints, cameraMatrix = camMatrix, distCoeffs = None)
返回的错误信息是:
cv2.error: C:\slave\WinInstallerMegaPack\src\opencv\modules\calib3d\src\solvepnp.cpp:52: >error: (-215) npoints >= 0 && npoints == std::max(ipoints.checkVector(2, CV_32F), >ipoints.checkVector(2, CV_64F))
如果能帮我解决这个问题,或者告诉我哪里出错了,我会非常感激。我还有很多东西需要学习!
2 个回答
3
如果你尝试把一个数组切片作为输入,这也会引发问题。摘自 这里
World = array([[-0.5, -0.5, 3. ],
[ 0.5, -0.5, 3. ],
[ 0.5, 0.5, 3. ],
[-0.5, 0. , 3. ]])
keyPoints = array([[ 279.03286469, 139.80463604, 1. ],
[ 465.40665724, 136.70519839, 1. ],
[ 465.40665724, 325.1505936 , 1. ],
[ 279.03286469, 230.927896 , 1. ]])
objectPoints = World
imagePoints = keyPoints[:,:2] # <--- THIS SLICE IS A PROBLEM CAUSER!!!
cv2.solvePnP(objectPoints, imagePoints, np.eye(3), np.zeros(5))
3
你给 solvePnP
函数的参数形状不对。objectPoints
应该是 Nx3 的格式,也就是有 N 行,每行有 3 个数字;而 imagePoints
应该是 Nx2 的格式,也就是有 N 行,每行有 2 个数字。如果我把你例子里 tPoints
和 mPoints
赋值给这些参数的顺序调换一下,就不会出现错误了。