Python solvePnPRansac为rvecs和TVEC返回零值
我想找出我相机的旋转和平移矢量 然而,文件中的solvePnPRansac方法给出的矩阵均为零;它返回角点的值作为输出Python solvePnPRansac为rvecs和TVEC返回零值,python,opencv,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 1
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)
rvecs
和tvecs
将分别成为[0,0,0]
和[0,0,0]
。我可能也遇到了同样的问题——调用solvePnPRansac后,在rvec和tvec中得到零。我找到了一个解决方法-使用solvePnP而不是solvePnPRansac。这对我的4分很有效。但是我的程序是用C++编写的,而不是Python。这是我在开发过程中使用的一些信息,但我想你已经知道了。希望这有帮助 我将solvePnPRansac与python一起使用,我也遇到了同样的问题。与solvePnP相比,solvePnPRansac提供的是,它基于从给定的点对应集合中选择4个或更多点来计算rvec和tvec。做出此选择时,由此获得的投影将导致对所有给定点的足够好的拟合。如果你没有得到一个足够好的拟合点的任何选择,函数将返回零
您可以增加“reprojectError”的值(默认为8)。这将接受更大的重投影错误,因此结果不太好,但可能比根本没有结果要好(除非您的目标是高精度)。例如,尝试:
rvecs, tvecs , inliers = cv2.solvePnPRansac(objp, corners, mtx, dist,reprojectionError=10)
最后,为了完整性,如果您为reprojectError选择一个值,该值高到可以考虑所有点,同时仍然导致可接受的拟合,那么您的结果将与使用solvePnP时相同。我使用了相同的方法来修复我的。。。!谢谢,虽然我也有同样的问题。有时solvePnPRansac返回合理的结果,但有时我得到0,0,0