Как можно добиться небольшой ошибки воспроизведения с помощью opnCV? - PullRequest
0 голосов
/ 11 марта 2020

Я использую OpenCV как Tutoral здесь . К сожалению, я не понимаю, как можно уменьшить среднюю ошибку воспроизведения. Я использую шахматную доску размером от 6 до 4. Я также могу влиять на область поиска с помощью функции cornerSubPix. У меня ошибка от 0,7 до примерно 3 пикселей в зависимости от камеры, но разрешение всегда одинаковое.

Кроме того, у меня есть две линзы. Чем меньше погрешность исходит от камеры с фокусным расстоянием 6 мм, тем больше погрешность исходит от камеры с фокусным расстоянием 30 мм.

Из-за моего кода результат плохой? Или я должен что-то учитывать при съемке?

Я использую следующий код:

path_name = './data/*.jpg'
board_width = 6
board_height = 4
square_size = 110 #[mm] 

criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)

objp = np.zeros((board_height*board_width,3), np.float32)
objp[:,:2] = np.mgrid[0:board_width,0:board_height].T.reshape(-1,2)*square_size 

objpoints = [] # 3d point in real world space
imgpoints = [] # 2d points in image plane.

images = glob.glob(path_name)

for fname in images:
    img = cv2.imread(fname)
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

    ret, corners = cv2.findChessboardCorners(gray, (board_width,board_height),None)

    if ret == True:
        objpoints.append(objp)

        corners2 = cv2.cornerSubPix(gray,corners,(5,5),(-1,-1),criteria)
        imgpoints.append(corners2)

        img = cv2.drawChessboardCorners(img, (board_width,board_height), corners2,ret)
        #image = cv2.resize(img, (1028, 752))
        #cv2.imshow("image", image)
        #cv2.waitKey(100)

cv2.destroyAllWindows()

retval, cameraMatrix, distCoeffs, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1],None,None)
retval, cameraMatrix, distCoeffs, rvecs, tvecs, stdDeviationsIntrinsics, stdDeviationsExtrinsics, perViewErrors = cv2.calibrateCameraExtended(objpoints, imgpoints, gray.shape[::-1], cameraMatrix, distCoeffs)



cv_file = cv2.FileStorage("cam.yml", cv2.FILE_STORAGE_WRITE)

[...]

cv_file.release()

Тогда мой результат как:

[...]
camera_matrix: !!opencv-matrix
   rows: 3
   cols: 3
   dt: d
   data: [ 1.9559374807020929e+03, 0., 2.0428473382526779e+03, 0.,
       1.9638127960739512e+03, 1.5557663707100560e+03, 0., 0., 1. ]
distortion_coefficients: !!opencv-matrix
   rows: 1
   cols: 5
   dt: d
   data: [ -2.1838555943133031e-01, 2.7847719015637917e+00,
       4.1974899313532484e-03, -8.2215146697108520e-04,
       -1.3016726976766938e+01 ]
avg_reprojection_error: 2.9218207016515794e+00
[...]
...