solvePnPRansac为rvecs和tvecs返回零值

时间:2014-05-28 20:20:06

标签: python opencv

我想找出相机的旋转和平移向量。

但是,文档中的solvePnPRansac方法为每个方法提供零矩阵;它将拐角的值作为输出返回。

 print corners
[[[ 372.48184204   80.71842194]]
 [[ 374.40280151  103.50676727]]
 [[ 377.49230957  128.53459167]]
      ... so on till ..
 [[ 204.40803528  168.18978882]]
 [[ 203.94168091  193.23649597]]
 [[ 204.39024353  220.48114014]]
 [[ 204.54725647  248.10583496]]]

我正在使用文档中的代码并根据我的棋盘进行修改。

criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
objp = np.zeros((7*7,3), np.float32)
objp[:,:2] = np.mgrid[0:7,0:7].T.reshape(-1,2)
axis = np.float32([[3,0,0], [0,3,0], [0,0,-3]]).reshape(-1,3)

for fname in glob.glob('../Right*.jpg'):
      img = cv2.imread(fname)
      gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
      ret, corners = cv2.findChessboardCorners(gray, (7,7),None)
      print ret,corners #ret is true and corners returns an array
      if ret == True:
        # Find the rotation and translation vectors.
         rvecs, tvecs , inliers = cv2.solvePnPRansac(objp, corners, mtx, dist)

rvecstvecs分别为[0,0,0][0,0,0]

2 个答案:

答案 0 :(得分:1)

我在python中使用了solvePnPRansac,我遇到了同样的问题。与solvePnP相比,solvePnPRansac提供的是它根据给定的点对应集合中的4个或更多点的选择来计算rvec和tvec。进行这种选择使得由此获得的投影将导致对所有给定点的足够好的拟合。如果你没有足够的适合任何点数,该函数将返回零。

你可以增加" reprojectError"的值。 (默认为8)。这将为重投影接受更大的误差,因此结果不太好,但它可能比没有结果好(除非你的目标是高精度)。例如,尝试:

rvecs, tvecs , inliers = cv2.solvePnPRansac(objp, corners, mtx, dist,reprojectionError=10)

最后,为了完整性,如果您选择reprojectError的值为高,可以考虑所有点,同时仍然导致可接受的拟合,则结果将与使用solvePnP时的结果相同。

答案 1 :(得分:0)

我可能遇到同样的问题 - 在调用solvePnPRansac之后在rvec,tvec中获得零。我找到了一个解决方法 - 使用solvePnP而不是solvePnPRansac。它适用于我的4分。但我的程序是用C ++编写的,而不是Python。这里http://docs.opencv.org/trunk/doc/py_tutorials/py_calib3d/py_pose/py_pose.html是我在开发过程中使用的一些信息,但我想你已经知道了。希望这可以帮助。