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提供的函數文檔有點模糊,其原文如下圖:完整版文檔在這裏

      其中參數“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、本文中鏈接中的鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章