[英]OpenCV Stereo Camera Calibration Error: Assertion failed
我知道這個問題被問過幾次,但是答案並不能解決我的問題。
我想校准一對用作立體聲輸入的攝像機。 但是,當我運行代碼時,出現錯誤消息:
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 )
多數情況下,拋出該消息時,似乎Message引用的是空的或未均勻填充的數組(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-確保您的對象點是3d
2-確保左點,右點和對象點具有相同的大小(視圖數)。
3-確保列表的每個索引處的左點,右點和對象點具有相同數量的點。
編輯:您的對象點objp必須包含3d點的列表/向量,當前其形狀類似於(44,3),必須為(NUM_IMAGES,44,3)。 您可以使用objp = np.repeat(objp[np.newaxis, :, :], NUM_IMAGES, axis=0)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.