1

我在 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的参数?

4

0 回答 0