OpenCV::solvePNP() - Assertion failed

后端 未结 3 1760
臣服心动
臣服心动 2021-01-16 01:28

I am trying to get the pose of the camera with the help of solvePNP() from OpenCV.

After running my program I get the following errors:

OpenCV Error:         


        
相关标签:
3条回答
  • 2021-01-16 01:49

    The types don't seem right, at least in the code that worked for me I used different types(as mentioned in the documentation).

    objectPoints – Array of object points in the object coordinate space, 3xN/Nx3 1-channel or 1xN/Nx1 3-channel, where N is the number of points. vector can be also passed here.

    imagePoints – Array of corresponding image points, 2xN/Nx2 1-channel or 1xN/Nx1 2-channel, where N is the number of points. vector can be also passed here.

    cameraMatrix – Input camera matrix A = \vecthreethree{fx}{0}{cx}{0}{fy}{cy}{0}{0}{1} .

    distCoeffs – Input vector of distortion coefficients (k_1, k_2, p_1, p_2[, k_3[, k_4, k_5, k_6]]) of 4, 5, or 8 elements. If the vector is NULL/empty, the zero distortion coefficients are assumed.

    rvec – Output rotation vector (see Rodrigues() ) that, together with tvec , brings points from the model coordinate system to the camera coordinate system.

    tvec – Output translation vector.

    useExtrinsicGuess – If true (1), the function uses the provided rvec and tvec values as initial approximations of the rotation and translation vectors, respectively, and further optimizes them.

    Documentation from here.

    vector<Mat> rvec, tvec should be Mat rvec, tvec instead.

    vector<vector<Point2f> > imagePoints(1) should be vector<Point2f> imagePoints(1) instead.

    vector<vector<Point3f> > boardPoints(1) should be vector<Point3f> boardPoints(1) instead.

    Note: I encountered the exact same problem, and this worked for me(It is a little bit confusing since calibrateCamera use vectors). Haven't tried it for imagePoints or boardPoints though.(but as it is documented in the link above, vector,vector should work, I thought I'd better mention it), but for rvec,trec I tried it myself.

    0 讨论(0)
  • 2021-01-16 01:59

    I run in exactly the same problem with solvePnP and opencv3. I tried to isolate the problem in a single test case. I seams passing a std::vector to cv::InputArray does not what is expected. The following small test works with opencv 2.4.9 but not with 3.2.

    And this is exactly the problem when passing a std::vector of points to solvePnP and causes the assert at line 63 in solvepnp.cpp to fail !

    Generating a cv::mat out of the vector list before passing to solvePnP works.

    //create list with 3 points
    std::vector<cv::Point3f> vectorList;
    vectorList.push_back(cv::Point3f(1.0, 1.0, 1.0));
    vectorList.push_back(cv::Point3f(1.0, 1.0, 1.0));
    vectorList.push_back(cv::Point3f(1.0, 1.0, 1.0));
    
    //to input array
    cv::InputArray inputArray(vectorList);
    cv::Mat mat = inputArray.getMat();
    cv::Mat matDirect = cv::Mat(vectorList);
    
    LOG_INFO("Size vector: %d mat: %d matDirect: %d", vectorList.size(), mat.checkVector(3, CV_32F), matDirect.checkVector(3, CV_32F));
    
    QVERIFY(vectorList.size() == mat.checkVector(3, CV_32F));
    

    Result opencv 2.4.9 macos:

    TestObject: OpenCV
    Size vector: 3 mat: 3 matDirect: 3
    

    Result opencv 3.2 win64:

    TestObject: OpenCV
    Size vector: 3 mat: 9740 matDirect: 3
    
    0 讨论(0)
  • 2021-01-16 02:15

    Step into the function in a debugger and see exactly which assertion is failing. ( Probably it requires values in double (CV_64F) rather than float. )

    OpenCVs new "inputarray" wrapper issuppsoed to allow you to call functions with any shape of mat, vector of points, etc - and it will sort it out. But a lot of functions assume a particular inut format or have obsolete assertions enforcing a particular format.

    The stereo/calibration systems are the worst for requiring a specific layout, and frequently succesive operations require a different layout.

    0 讨论(0)
提交回复
热议问题