Python调用OpenCV的solvePnPRansac()函数出现OpenCV Error: Assertion failed...和too many values to unpack

前言

      求解物体位姿的需要,调用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提供的函数文档有点模糊,其原文如下图:完整版文档在这里

Python调用OpenCV的solvePnPRansac()函数出现OpenCV Error: Assertion failed...和too many values to unpack_第1张图片

      其中参数“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、本文中链接中的链接

你可能感兴趣的:(【Python学习】,Python,opencv,Assertion,error)