opencv摄像机标定之对极几何、深度地图

1.对极几何

(1)简单原理

  • 在我们使用针孔相机时,我们会丢失大量重要的信心,比如说图像的深度,或者说图像上的点和摄像机的距离,因这是一个从3D 到2D 的转换。因此一个重要的问题就产生了,使用这样的摄像机我们能否计算除深度信息呢?答就是使用多个相机。我们的眼睛就是这样工作的,使用两个摄像机(两个眼睛),这被称为立体视觉。
  • 如果只是用一台摄像机我们不可能知道3D 空间中的X 点到图像平面的距离,因为OX 连线上的每个点投影到图像平面上的点都是相同的。但是如果我们也考虑上右侧图像的话,直线OX 上的点将投影到右侧图像上的不同位置。所以根据这两幅图像,我们就可以使用三角测量计算出3D 空间中的点到摄像机的距离(深度)。
    在这里插入图片描述
  • 直线OX 上的不同点投射到右侧图像上形成的线l′ 被称为与x 点对应的极线。也就是说,我们可以在右侧图像中沿着这条极线找到x 点。它可能在这条直线上某个位置(这意味着对两幅图像间匹配特征的二维搜索就转变成了沿着极线的一维搜索。这不仅节省了大量的计算,还允许我们排除许多导致虚假匹配的点)。这被称为对极约束。与此相同,所有的点在其他图像中都有与之对应的极线。平面XOO’ 被称为对极平面。
  • O 和O’ 是摄像机的中心。从上面的示意图可以看出,右侧摄像机的中心O’ 投影到左侧图像平面的e 点,这个点就被称为极点。极点就是摄像机中心连线与图像平面的交点。因此点e’ 是左侧摄像机的极点。有些情况下,我们可能不会在图像中找到极点,它们可能落在了图像之外(这说明这两个摄像机不能拍摄到彼此)。
  • 所有的极线都要经过极点。所以为了找到极点的位置,我们可以先找到多条极线,这些极线的交点就是极点。本节我们的重点就是找到极线和极点。为了找到它们,我们还需要两个元素,本征矩阵(E)和基础矩阵(F)。本征矩阵包含了物理空间中两个摄像机相关的旋转和平移信息。
  • 简单来说,基础矩阵F 将一副图像中的点映射到另一幅图像中的线(极线)上。这是通过匹配两幅图像上的点来实现的。要计算基础矩阵至少需要8 个点(使用8 点算法)。

(2)代码速记

  • cv2.xfeatures2d.SIFT_create()
  • sift.detectAndCompute()
  • cv2.FlannBasedMatcher()
  • flann.knnMatch()
  • cv2.findFundamentalMat()
  • cv2.computeCorrespondEpilines()

参数:

#计算基础矩阵
F, mask = cv2.findFundamentalMat(pts1, pts2, cv2.FM_LMEDS)#points1,points2,method
#计算极线
lines1 = cv2.computeCorrespondEpilines(pts2.reshape(-1, 1, 2), 2, F)#输入参数:points,whichImage,F,lines

(3)实战

# 绘制极线的函数
def drawlines(img1, img2, lines, pts1, pts2):
    r, c = img1.shape
    img1 = cv2.cvtColor(img1, cv2.COLOR_GRAY2BGR)
    img2 = cv2.cvtColor(img2, cv2.COLOR_GRAY2BGR)
    for r, pt1, pt2 in zip(lines, pts1, pts2):
        color = tuple(np.random.randint(0, 255, 3).tolist())
        x0, y0 = 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值