【问题标题】:OpenCV Stereo Camera Calibration Error: Assertion failedOpenCV 立体相机校准错误:断言失败
【发布时间】:2023-03-23 14:54:01
【问题描述】:

我知道这个问题被问了几次,但答案并没有解决我的问题。

我想校准一对摄像头以用作立体声输入。 但是当我运行代码时,我收到错误消息:

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() 后添加新轴时。 然后代码就可以完成了。我需要测试结果,但至少这个问题似乎得到了解决。

非常感谢

【问题讨论】:

    标签: python opencv camera calibration stereoscopy


    【解决方案1】:

    您说您正在进行立体校准,是否存在其他相机无法看到网格上的某些点的情况?当您的一个视图无法检测到校准图案上的所有点时,可能会出现此错误。需要考虑的三点是
    1- 确保您的对象点是 3d
    2- 确保您的左点、右点和对象点具有相同的大小(视图数量)。
    3-确保您的左点、右点和对象点在列表的每个索引处具有相同数量的点。

    编辑:您的对象点 objp 必须包含 3d 点的列表/向量,目前它的形状类似于 (44, 3),它必须是 (NUM_IMAGES, 44, 3)。你可以通过objp = np.repeat(objp[np.newaxis, :, :], NUM_IMAGES, axis=0)实现这一点

    【讨论】:

    • 感谢您的快速响应,我会在一秒钟内检查所有内容。网格应该在所有帧中都可见(并且可以被识别),因为我编写的捕获脚本只在两个网格都可见时才保存。
    • 现在可以确认: 1:所有对象点都是 3d,但我有时会在打印时找到对存储数据类型的引用。所以第一个元素前面是'array(',最后一个元素后面是'dtype=float32)',因为数组是用numpy命令创建的,我不太熟悉,不知道是否正常. 2./3.尽管提到了例外,但所有数组都具有相同的长度,并且它们在每个索引处的点数都相同。
    • 你能说明你的 objPoints 和 objp 变量是如何定义的吗?
    • 你的对象点变量 objp 也必须是一个多维数组,看看我的编辑。
    • 如果 NUM_IMAGES 代表图像数量,我想你已经为我解决了。该代码现在可以在没有任何异常的情况下运行。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2012-08-26
    • 1970-01-01
    • 2018-10-12
    • 2014-07-30
    • 1970-01-01
    • 2018-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多