【问题标题】:Error using solvePnPRansac function使用 solvePnPRansac 函数时出错
【发布时间】:2015-11-13 15:23:55
【问题描述】:

我正在使用 Python 2.7 和 opencv 3.0.0。 我正在尝试对实时视频进行姿势估计。 所以我使用了opencv提供的calibrate.py。它运作良好。 在这个程序中,我在最后添加了行来处理信息以构成轴。我用过这个:http://docs.opencv.org/master/d7/d53/tutorial_py_pose.html#gsc.tab=0

在使用solvePnPRansac函数的那一行,我写了这个:_, rvecs, tvecs, inliers = cv2.solvePnPRansac(obj_points[0], corners2, camera_matrix, dist_coefs)在行首添加_,

我出现了这个错误!

error: C:\builds\master_PackSlaveAddon-win64-vc12-static\opencv\modules\core\src\matrix.cpp:2294: error: (-215) d == 2 && (sizes[0] == 1 || sizes[1] == 1 || sizes[0]*sizes[1] == 0) in function cv::_OutputArray::create

完全看不懂!

有人可以帮我吗?

这是我处理视频的代码:

cap = cv2.VideoCapture(0)

while(1):


    # Take each frame
    ret, frame = cap.read()
    gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)

    # Find the chess board corners
    ret, corners = cv2.findChessboardCorners(gray, (6,5),None)

    if ret:

        term = ( cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_COUNT, 30, 0.1 )

        corners2 = cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),term)


        _, rvecs, tvecs, inliers = cv2.solvePnPRansac(obj_points[0], corners2, camera_matrix, dist_coefs)

        imgpts, jac = cv2.projectPoints(axis, rvecs, tvecs, camera_matrix, dist_coefs)


        frame = draw(frame,corners2,imgpts)

    cv2.imshow('img',frame)

    k = cv2.waitKey(5) & 0xFF
    if k == 27:
        break
cap.release()
cv2.destroyAllWindows()

【问题讨论】:

  • 这里也一样,你找到解决办法了吗?

标签: python opencv estimation


【解决方案1】:

我遇到了同样的问题。 我使用solvePnP而不是solvePnPRansac,它工作得很好。 我猜python中的solvePnPRansac有一个bug。

【讨论】:

    【解决方案2】:

    solvePnpRansac只有三个输出值:

    OutputArray     rvec,
    OutputArray     tvec, 
    OutputArray     inliers = noArray(), 
    

    所以删除开头的_, 应该会使程序再次运行。

    【讨论】:

    • 这对我不起作用。我得到:rvec, tvec, inliers = cv2.solvePnPRansac(objp,corners2, K, D) cv2.error: C:\builds\master_PackSlaveAddon-win64-vc12-static\opencv\modules\core\src\matrix.cpp: 2355: 错误: (-215) d == 2 && (sizes[0] == 1 || sizes[1] == 1 || sizes[0]*sizes[1] == 0) 在函数 cv:: _OutputArray::create
    【解决方案3】:

    您需要在示例中以相同的方式定义obj_points。 我在提供的代码 sn-p 中没有看到 obj_points 定义,我认为这就是问题所在

    obj_points= np.zeros((6*7,3), np.float32)
    obj_points[:,:2] = np.mgrid[0:7,0:6].T.reshape(-1,2)
    

    【讨论】:

      【解决方案4】:

      solvePnP 和solvePnPRansac 之间的3D 模型点定义存在差异。 Is not clear in the documentation,但是solvePnP需要使用3xN/Nx3矩阵定义的模型,而solvePnPRansac需要3x1xN/Nx1x3矩阵定义的模型。

      您可以使用此代码将额外维度包含到您的模型中:

      modelNx1x3 = np.zeros((N, 1, 3), np.float32)
      modelNx1x3[:, 0, :] = modelNx3[:, :]
      

      您还可以在the issue tracker in github找到更多详细信息

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多