Ошибка калибровки стереокамеры OpenCV: подтверждение не выполнено - PullRequest
0 голосов
/ 09 сентября 2018

Я знаю, что этот вопрос задавали несколько раз, но ответы не решают мою проблему.

Я хочу откалибровать пару камер для использования в качестве стереофонического входа. Но когда я запускаю код, я получаю сообщение об ошибке:

OpenCV(3.4.1) Error: Assertion failed (nimages > 0 && nimages == (int)imagePoints1.total() && (!imgPtMat2 || nimages == (int)imagePoints2.total())) in collectCalibrationData, file /tmp/opencv-20180529-49540-yj8rbk/opencv-3.4.1/modules/calib3d/src/calibration.cpp, line 3133 Traceback (most recent call last): File "/Users/MyName/Pycharm/Project/calibration.py", line 342, in <module> TERMINATION_CRITERIA ) cv2.error: OpenCV(3.4.1) /tmp/opencv-20180529-49540-yj8rbk/opencv-3.4.1/modules/calib3d/src/calibration.cpp:3133: error: (-215) nimages > 0 && nimages == (int)imagePoints1.total() && (!imgPtMat2 || nimages == (int)imagePoints2.total()) in function collectCalibrationData Мой код:

def distortion_matrix(path, objpoints, imgpoints):

  for item in os.listdir(path):
    if item.endswith(".jpg"):
        cap = cv2.VideoCapture(path+item, cv2.CAP_IMAGES)

        ret, img = cap.read()  # Capture frame-by-frame

        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

        keypoints = blobDetector.detect(gray)  # Detect blobs.

                    im_with_keypoints = cv2.drawKeypoints(img, keypoints, np.array([]), (0, 255, 0),
                                              cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
        im_with_keypoints_gray = cv2.cvtColor(im_with_keypoints, cv2.COLOR_BGR2GRAY)
        ret, corners = cv2.findCirclesGrid(im_with_keypoints, (4, 11), None,
                                           flags=cv2.CALIB_CB_ASYMMETRIC_GRID)  

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

            corners2 = cv2.cornerSubPix(im_with_keypoints_gray, corners, (11, 11), (-1, -1),
                                        criteria)  
            imgpoints.append(corners2)


  cap.release()

_, leftCameraMatrix, leftDistortionCoefficients, _, _ , objpoints0, imgpoints0 = distortion_matrix("./calibration/left/", objpoints0, imgpoints0)
_, rightCameraMatrix, rightDistortionCoefficients, _, _, objpoints1, imgpoints1 = distortion_matrix("./calibration/right/", objpoints1, imgpoints1)



(_, _, _, _, _, rotationMatrix, translationVector, _, _) = cv2.stereoCalibrate( objp, imgpoints0, imgpoints1, 
                                                                            leftCameraMatrix, leftDistortionCoefficients, 
                                                                            rightCameraMatrix, rightDistortionCoefficients, 
                                                                            imageSize, None, None, None, None,
                                                                            cv2.CALIB_FIX_INTRINSIC, TERMINATION_CRITERIA )

В большинстве случаев, когда это выбрасывается, кажется, что Сообщение относится к массивам (imgpoint и objpoint), которые пусты или заполнены неравномерно. Но в итоге оба получили длину 20 (я сканирую 20 изображений, так что это кажется правильным), и каждая ячейка массива имеет 44 сохраненных массива (круговая сетка, которую я использую, имеет 44 точки, так что это тоже кажется правильным).

** Редактировать: ** Мой objp, imgpoint и objpoint определены так:

objp = np.zeros((np.prod(pattern_size), 3), np.float32)
objp[0]  = (0, 0, 0)
objp[1]  = (0, 2, 0)
objp[2]  = (0, 4, 0)
objp[3]  = (0, 6, 0)
...


objpoints0 = []
objpoints1 = []

imgpoints0 = []
imgpoints1 = []

** Редактировать 2: **

Если NUM_IMAGES обозначает Количество изображений, я думаю, что оно у меня есть. Но только когда я добавляю новую ось после того, как я позвоню distortion_matrix(). Затем код может завершить. Мне нужно проверить результаты, но, по крайней мере, эта проблема, кажется, будет решена.

Большое спасибо

1 Ответ

0 голосов
/ 09 сентября 2018

Вы сказали, что делаете стереокалибровку, есть ли случай, когда некоторые точки на вашей сетке не видны с другой камеры? Эта ошибка может появляться, когда один из ваших взглядов не может обнаружить все точки на калибровочном шаблоне. Три пункта для рассмотрения являются
1- Убедитесь, что ваши объектные точки 3d
2. Убедитесь, что ваши левые, правые и объектные точки имеют одинаковый размер (количество просмотров).
3. Убедитесь, что ваши левые точки, правые точки и точки объекта имеют одинаковое количество точек в каждом индексе списка.

Edit: ваш объектный объект objp должен содержать список / вектор 3d-точек, в настоящее время его форма имеет вид (44, 3), это должно быть (NUM_IMAGES, 44, 3). Вы можете достичь этого с objp = np.repeat(objp[np.newaxis, :, :], NUM_IMAGES, axis=0)

...