【问题标题】:Stereo rectification problem with OpenCV and PythonOpenCV 和 Python 的立体校正问题
【发布时间】:2022-04-21 15:22:01
【问题描述】:

    import cv2
    import glob
    import argparse
    import math
    from numpy import genfromtxt
    import matplotlib.pyplot as plt
    import numpy as np
    import os.path
    from scipy import ndimage
    import os


    left = cv2.imread('D:/input image 1.jpg', cv2.IMREAD_UNCHANGED)
    right = cv2.imread('D:/input image 2.jpg', cv2.IMREAD_UNCHANGED)
    #left = (left/256).astype('uint8')
    #right = (right/256).astype('uint8')


    cameraMatrix1 = np.array([[1485.8503101355045, 0, 641.0072474534551], [0, 1486.8249802291273, 454.1981417235667], [0, 0, 1]])
    cameraMatrix2 = np.array([[1472.34425902698, 0, 656.7358738783742], [0, 1473.184475795988, 441.016803589085], [0, 0, 1]])
    distCoeffs1 = np.array([-0.09236217303671054, 0.15801009565677457, 0.0020679941868083445, -0.0023435708660260184, 0.04491629603683055])
    distCoeffs2 = np.array([-0.09949068652688753, 0.22953391558591676, 0.0016749995113326907, -0.0015940937703328348, -0.13603886268508916])
    rotationMatrix = np.array([[0.9999169807005986, 0.0026862926847088424, -0.012602203704541104],[-0.002633967055223802, 0.9999878496600472, 0.0041668633079119935],[0.012613243997904163, -0.004133323588458492, 0.9999119069757908]])
    transVector = np.array([29.96389633009774, 0.5883268401189343, -5.0370190999346365])
    essentialMatrix = np.array([[-0.005846632380824811, 5.0345261532342365, 0.6092635826971343], [-5.4145428656773165, 0.11031957194242471, -29.897779179091888], [-0.6672019134164675, 29.96195184048419, 0.1322696748639909]])
    fundMatrix = np.array([[4.567507458136527e-08, -3.930495370357416e-05, 0.010750771532659317], [4.227537878312907e-05, -8.607826196991683e-07, 0.3201405456504413], [-0.010999824926761303, -0.3182113833954986, 1]])


    flags = cv2.CALIB_ZERO_DISPARITY
    image_size = left.shape[::-1]

    R1, R2, P1, P2, Q, roi1, roi2 = cv2.stereoRectify(cameraMatrix1, distCoeffs1, cameraMatrix2, distCoeffs2, image_size, rotationMatrix, transVector, flags = flags)

    leftmapX, leftmapY = cv2.initUndistortRectifyMap(cameraMatrix1, distCoeffs1, R1, P1, image_size, cv2.CV_32FC1)
    rightmapX, rightmapY = cv2.initUndistortRectifyMap(cameraMatrix2, distCoeffs2, R2, P2, image_size, cv2.CV_32FC1)

    left_remap = cv2.remap(left, leftmapX, leftmapY, cv2.INTER_LANCZOS4)
    right_remap = cv2.remap(right, leftmapX, rightmapY, cv2.INTER_LANCZOS4)


    # For some reason, the images get rotated upside down after remapping, and I have to invert them back
    left_remap = ndimage.rotate(left_remap,180)
    right_remap = ndimage.rotate(right_remap,180)

    for line in range(0, int(right_remap.shape[0] / 20)):
        left_remap[line * 20, :] = 0
        right_remap[line * 20, :] = 0

    cv2.namedWindow('output images', cv2.WINDOW_NORMAL)
    cv2.imshow('output images', np.hstack([left_remap, right_remap]))
    cv2.waitKey(0)
    cv2.destroyAllWindows()

我正在对水平方向和垂直方向的 5 个不同镜头进行校正(即,我需要所有 5 个镜头的图像中的所有共同点都完全位于同一位置)。当我用两个水平放置比垂直放置更远的镜头测试立体反射时,cv2.stereoRectify 总是将它们解释为好像它们是垂直分离的。我希望能够告诉函数水平解释它。我在这里看到了一些类似的问题,但在任何地方都找不到有用的回复。

编辑:为了便于复制,我在代码中添加了所有失真系数和校准矩阵。这些值是通过使用大量校准图像和函数 cv2.stereoCalibrate 获得的,但无法上传所有这些图像和代码提取系数。

output image

input image 1

input image 2

clarifying the issue

【问题讨论】:

  • 我猜你的校准代码有一些错误。以下是我在上面的代码中发现的一些错误:right_remap = cv2.remap(right, rightmapX, rightmapY, cv2.INTER_LANCZOS4) 对于未知的输出反转,您需要翻转您的旋转和平移向量:cv2.stereoRectify(cameraMatrix1, distCoeffs1, cameraMatrix2, distCoeffs2, image_size, rotationMatrix.T, -transVector, flags = flags) 如果数据集是开源的,您可以在此处提供链接。
  • @SriRaghuMalireddi 当我意识到校准和校正算法以一定的左右顺序工作并且我必须相应地提供左右图像时,输出旋转问题实际上得到了解决。至于数据集,因为它们只是方格的棋盘图像,我会在方便的时候上传。
  • 左右图像顺序解释了为什么 {R,T} 反转起作用。
  • @SriRaghuMalireddi 当我一直在研究有关立体校正的更多信息时,我现在想知道 steroRectify 函数是否实际上将它们对齐到具有更大差异的方向(这意味着如果我的整个问题在全部?)。因为我发现立体校正过程实际上为视差图提供了输入(这意味着在立体校正过程之后重新映射的图像不会完全或几乎完全相互匹配)。这是正确的吗?
  • StereoRectification 使用来自两个相机的信息(在校准过程中获得)将图像投影到单个视图平面中。这意味着两个图像都应该在任何可能的方向上对齐,就好像它们被缝合在一起一样。所以,OpenCV 的 stereoRectification 也应该这样做。立体声校正可能无法正常工作的唯一原因是代码中存在错误或您的校准阶段错误。

标签: python opencv camera-calibration stereo-3d multiview


【解决方案1】:

image_size修改这个

image_size = left.shape[::-1][1:3]

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请编辑以添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。您可以在help center 中找到有关how to write good answers 的更多信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-29
  • 2013-05-04
  • 2014-07-30
  • 1970-01-01
  • 2011-07-24
  • 1970-01-01
  • 2016-10-13
相关资源
最近更新 更多