求解物体位姿的需要,调用OpenCv库的现成模块solvePnP()和solvePnPRansac(),使用solvePnP()时比较顺利,但是调用solvePnPRansac()是出现问题。
1、运行时提示“OpenCV Error: Assertion failed (d == 2 && (sizes[0] == 1 || sizes[1] == 1 || sizes[0]*sizes[1] == 0)) in create, file /home/travis/miniconda/conda-bld/conda_1486587069159/work/opencv-3.1.0/modules/core/src/matrix.cpp, line 2355”,并且最后出现这样的错误描述:“error: /home/travis/miniconda/conda-bld/conda_1486587069159/work/opencv-3.1.0/modules/core/src/matrix.cpp:2355: error: (-215) d == 2 && (sizes[0] == 1 || sizes[1] == 1 || sizes[0]*sizes[1] == 0) in function create”。
2、解决完上面的问题1后运行出现“ValueError: too many values to unpack (expected 3)”。
1、出现问题一是因为调用solvePnPRansac()函数是传入参数有问题,最大的问题是opencv提供的函数文档有点模糊,其原文如下图:完整版文档在这里
其中参数“objectPoints”和“imagePoints”原文说明的是3xN/Nx3 1-channel or 1xN/Nx1 3-channel,这个部分说明有点模糊。如果直接将将这两个参数传递为Nx3和Nx2,就会出现这个问题,这里面参数格式应该是Nx1x3和Nx1x2。需要将Nx3和Nx2格式的参数reshape为Nx1x3和Nx1x2。可以参考这篇文章:solvePnP object_points / image_points shape?
具体的问题描述可以参考:Python bindings for solvePnPRansac #6304
2、解决完上面的问题1后运行出现“ValueError: too many values to unpack (expected 3)”,具体原因是因为solvePnPRansac()函数的输出也是四个,而上面的文档里面值给出了三个输出参数,所以会报错。
最后完整的代码如下,其中point_3D的格式为[n,3],point_2D的shape为[n,2],n为对应点的个数,cameraMatrix为相机的内参数矩阵,shape为[3,3],distCoeffs为失真参数,shape根据上面的文档设置就好,shape可以为[8,1]。其余的输入参数可以根据自己的需要设置。输出有四个参数,需要全部给定。
_, R_exp, t, inliers = cv2.solvePnPRansac(points_3D.reshape(-1, 1, 3),
points_2D.reshape(-1, 1, 2),
cameraMatrix,
distCoeffs,
)
1、本文中所有链接
2、本文中链接中的链接