我在 Python3 上使用 OpenCV,我想获得一个棋盘角的位置,其尺寸pattern_size
在一个平行于我所拥有的棋盘的一个平面上,垂直位移一个特定的值fdz
(在棋盘中侧单位)。为了实现这一点,我以这种方式修改了可以在https://docs.opencv.org/3.1.0/d7/d53/tutorial_py_pose.html中找到的姿势算法:
function vertical(img,pattern_size, corners, camera_matrix, dist_coefs,fdz):
objp = np.zeros((pattern_size[1]*pattern_size[0],3), np.float32)
objp[:,:2] = np.mgrid[0:pattern_size[0],0:pattern_size[1]].T.reshape(-1,2)
a = []
for j in range(pattern_size[1]):
for i in range(pattern_size[0]):
axis = np.float32([[0,0,0], [0,0,0], [i,j,-fdz]]).reshape(-1,3)
# Find the rotation and translation vectors.
_, rvecs, tvecs, inliers = cv2.solvePnPRansac(objp, corners, camera_matrix, dist_coefs)
# project 3D points to image plane
imgpts, jac = cv2.projectPoints(axis, rvecs, tvecs, camera_matrix, dist_coefs)
imgpts = np.array(imgpts)
a.append(imgpts[2].ravel())
# draw circles on points found
cv2.circle(pose, (imgpts[2].ravel()[0], imgpts[2].ravel()[1]), 5, (0,255,0), -1)
cv2.imwrite('./pose.jpg', pose)
return(a)
这适用于某些图像(原始图像),而对于其他一些图像则可以:
输出图像。你对这个问题有什么建议吗?我最好的猜测是我还没有完全理解如何cv2.solvePnPRansac
工作cv2.projectPoints
。
编辑
我确实发现问题是由于 RANSAC 算法造成的:在这里您可以看到应用的结果,cv2.solvePnP
而不是cv2.solvePnPRansac
像以前一样应用于同一图像;但是,这似乎只发生在棋盘和相机法线之间的角度大于某个阈值的情况下,低于该阈值脚本可以正常工作。
但是,使用和不使用 RANSAC 步骤的结果略有不同,因此尝试包含它可能会很有用。你知道为什么会发生这种情况吗?有没有办法控制算法中RANSAC的参数?