双目立体视觉 I:标定和校正

2024-06-21 08:18

本文主要是介绍双目立体视觉 I:标定和校正,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

点击上方“AI公园”,关注公众号,选择加“星标“或“置顶”


作者:Ali Yasin Eser

编译:ronghuaiyang

导读

双目立体校正和标定。

大家好!今天我们将讨论什么是立体摄像机,以及我们如何将它用于计算机视觉。通过使用这里的代码:https://github.com/aliyasineser/stereoDepth,我将解释我们如何为立体摄像机校准摄像机并计算视差图。我不会深入数学细节,你可以阅读一些OpenCV文档。

我们能感知深度的原因是我们美丽对齐的眼睛。如果你注意到,当我们用一只眼睛看近处的物体时,我们会看到两种角度的不同。但当你看远处的东西时,比如几公里外的山或建筑,你看不到区别。这些差异在我们的大脑中自动处理,我们可以感知深度!眼睛一个在左一个在右的动物无法感知深度,因为它们没有共同的视角,相反,它们有广角视角。有些动物,比如鸭子,通过摇头或快速奔跑来感知深度。我们不会讨论这个概念,现在,让我们关注像我们的眼睛这样的系统。

简化的立体视觉。你可以看到物体P是如何被两个摄像机观察到的。物体的位置在两个图像中是不同的。

如果两台相机垂直对齐,观察到的物体将在同一垂直坐标上(图像中的同一列),所以我们只能关注x坐标来计算深度,因为近的物体在x轴上会有较大的差值。但为了实现这一目标,我们需要对相机进行校准,以修正镜头畸变。校准后,我们需要对系统进行校正。校正基本上就是两台相机之间的校准。如果我们校准和矫正我们的立体摄像机,两个物体将在相同的y轴上,并且观测点P(x,y)可以在图像的同一行中找到,P1(x1,y)是第一个摄像机,P2(x2,y)是第二个摄像机。从这里开始,像素和深度计算之间的唯一区别就在于此。

左上角图像和右下角图像分别是左/右相机图像,左下角是它们的组合来显示差异,右下角是深度图。

首先,将立体摄像机安装在一个固体物体上(尺子、木头或硬塑料材料等),使校准和校正参数能够正常工作。例如,如果你有Intel Realsense或zed相机,你可以跳过所有的部分,因为Realsense有自动校准功能,zed已经按出厂默认校准。下一步是分别校准两个相机。你可以按照这里:https://medium.com/@aliyasineser/opencv-camera-calibration-e9a48bdd1844进行校正。立体摄像机首先需要单相机校准,因为校正需要这些参数。使用棋盘格图像进行校准,使用至少20张图像以进行良好的计算。

左图和右图的例子。注意拍照的时候要同步,在校正中,即使小的差别也会影响结果。

这些图像会给我们提供摄像机所需的信息。为了更好的校准,你不能移动并获取同步的图像。你可以使用grab和retrieve函数来获得更接近的时间戳。对于拍摄图像,你可以使用这个代码:https://github.com/aliyasineser/stereoDepth/blob/master/getStereoImages.py,对于校准,你可以使用这个代码:https://github.com/aliyasineser/stereoDepth/blob/master/stereo_camera_calibration.py。关于代码:

  1. 立体标定:立体摄像机的摄像机标定。

  2. 立体校正:通过旋转和平移使它们在y轴上对齐,使这些摄像机观察到的每个点都在每个摄像机图像的同一列中。

OpenCV立体标定函数:

ret, K1, D1, K2, D2, R, T, E, F = cv2.stereoCalibrate(objp, leftp, rightp, K1, D1, K2, D2, image_size, criteria, flag)

我们要注意函数中的flags:

  • CV_CALIB_FIX_INTRINSIC: K和D个矩阵是固定的。这是默认标志。如果你校准好你的相机,你可以修正它们,所以你只会得到校正矩阵。

  • CV_CALIB_USE_INTRINSIC_GUESS: K和D个矩阵将被优化。对于这个计算,你应该给出经过良好校准的矩阵,以便(可能)得到更好的结果。

  • CV_CALIB_FIX_PRINCIPAL_POINT: 修复K矩阵中的参考点。

  • CV_CALIB_FIX_FOCAL_LENGTH: 在K矩阵中固定焦距。

  • CV_CALIB_FIX_ASPECT_RATIO: 固定长宽比。

  • CV_CALIB_SAME_FOCAL_LENGTH: 校准焦距,并设置Fx和Fy相同的校准结果。我对这个不熟悉,但我肯定它是特定的立体设置所需要的。

  • CV_CALIB_ZERO_TANGENT_DIST: 去掉畸变。

  • CV_CALIB_FIX_K1, …, CV_CALIB_FIX_K6: 移除K1到K6的畸变。这对实验非常重要。我不熟悉这些背后的数学,但我做的实验帮助了我很多。

结果中的R, T, E, F系数给出了两个相机之间的关系,我们将使用它们进行校正:

R1, R2, P1, P2, Q, roi_left, roi_right = cv2.stereoRectify(K1, D1, K2, D2, image_size, R, T, flags=cv2.CALIB_ZERO_DISPARITY, alpha=0.9)

在这个函数中,我们只有一个标志CALIB_ZERO_DISPARITY,它用于匹配图像之间的y轴。alpha值用于转换后的黑色部分,因为图像会旋转,我们的大小不会改变,所以一些图像会是黑色的,我们的原始图像会小得多。我设置了相机的值。选项是:

  • alpha=-1 -> 让 OpenCV 优化黑色部分。

  • alpha= 0 -> 旋转和切割图像,使没有黑色的部分。这个选项在大多数情况下会严重削减图像,你不会得到一个像样的高质量的图像,但值得一试。

  • alpha= 1 -> 进行变换,但不要切任何东西。

  • alpha=experimental-> 有时候什么都不管用。这意味着你应该试验这些值。在某个特定的alpha值,你可以有一些黑色的部分,但高质量的图像。我为我的相机找到了最好的0.9756,所以不要失去希望:)、S

R矩阵和P矩阵称为旋转矩阵和投影矩阵。R1和P1给出从第一个(左)到第二个(右)摄像机的旋转和位置。R2和P2是从二到一。从视差图中得到深度图需要Q矩阵。包括相机之间的距离,焦距等,用于深度地图的处理。当计算深度值时,不要忘记将在与校准工作相同的单位中获得坐标。有很多参数,所以最好仔细检查。

对于结果,应该去看我们的测试代码:https://github.com/aliyasineser/stereoDepth/blob/master/stereo_depth.py。如果我们阅读主要部分,我们会看到我们使用了畸变校正:

leftMapX, leftMapY = cv2.initUndistortRectifyMap(K1, D1, R1, P1, (width, height), cv2.CV_32FC1)left_rectified = cv2.remap(leftFrame, leftMapX, leftMapY, cv2.INTER_LINEAR, cv2.BORDER_CONSTANT)rightMapX, rightMapY = cv2.initUndistortRectifyMap(K2, D2, R2, P2, (width, height), cv2.CV_32FC1)right_rectified = cv2.remap(rightFrame, rightMapX, rightMapY, cv2.INTER_LINEAR, cv2.BORDER_CONSTANT)

这意味着initUndistortRectifyMap函数可以同时实现图像的畸变校正和校准。对于左相机,我们使用K1(相机矩阵)和D1(失真矩阵)进行畸变校正,使用R1(从左到右旋转)和P1(从左到右投影矩阵)进行校正。在对remap进行变换后,我们将得到修正后的图像。对于右相机,我们会用相同的步骤做一遍,然后第一部分就完成了!总结一下过程:

这就是立体校准和标定。我们将在下一篇博客中讨论视差图的计算!

一些资源:

  • http://zone.ni.com/reference/en-XX/help/372916P-01/nivisionconceptsdita/guid-c9c3535b-faf7-4ade-9166-513a49d1b90a/

  • https://www.google.at/search?q=depth+map&source=lnms&tbm=isch&sa=X&ved=0ahUKEwjlqIq1xsjeAhUkglwKHahhDVIQ_AUIDigB&biw=1536&bih=732#imgrc=o7eiUTU5f3tKpM:

  • https://www.mathworks.com/discovery/stereo-vision.html

  • https://docs.opencv.org/3.0-beta/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html

—END—

英文原文:https://py.plainenglish.io/the-depth-i-stereo-calibration-and-rectification-24da7b0fb1e0

请长按或扫描二维码关注本公众号

喜欢的话,请给我个在看吧

这篇关于双目立体视觉 I:标定和校正的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1080681

相关文章

计算机视觉工程师所需的基本技能

一、编程技能 熟练掌握编程语言 Python:在计算机视觉领域广泛应用,有丰富的库如 OpenCV、TensorFlow、PyTorch 等,方便进行算法实现和模型开发。 C++:运行效率高,适用于对性能要求严格的计算机视觉应用。 数据结构与算法 掌握常见的数据结构(如数组、链表、栈、队列、树、图等)和算法(如排序、搜索、动态规划等),能够优化代码性能,提高算法效率。 二、数学基础

《计算机视觉工程师养成计划》 ·数字图像处理·数字图像处理特征·概述~

1 定义         从哲学角度看:特征是从事物当中抽象出来用于区别其他类别事物的属性集合,图像特征则是从图像中抽取出来用于区别其他类别图像的属性集合。         从获取方式看:图像特征是通过对图像进行测量或借助算法计算得到的一组表达特性集合的向量。 2 认识         有些特征是视觉直观感受到的自然特征,例如亮度、边缘轮廓、纹理、色彩等。         有些特征需要通

【python计算机视觉编程——7.图像搜索】

python计算机视觉编程——7.图像搜索 7.图像搜索7.1 基于内容的图像检索(CBIR)从文本挖掘中获取灵感——矢量空间模型(BOW表示模型)7.2 视觉单词**思想****特征提取**: 创建词汇7.3 图像索引7.3.1 建立数据库7.3.2 添加图像 7.4 在数据库中搜索图像7.4.1 利用索引获取获选图像7.4.2 用一幅图像进行查询7.4.3 确定对比基准并绘制结果 7.

参会邀请 | 第二届机器视觉、图像处理与影像技术国际会议(MVIPIT 2024)

第二届机器视觉、图像处理与影像技术国际会议(MVIPIT 2024)将于2024年9月13日-15日在中国张家口召开。 MVIPIT 2024聚焦机器视觉、图像处理与影像技术,旨在为专家、学者和研究人员提供一个国际平台,分享研究成果,讨论问题和挑战,探索前沿技术。诚邀高校、科研院所、企业等有关方面的专家学者参加会议。 9月13日(周五):签到日 9月14日(周六):会议日 9月15日(周日

【python计算机视觉编程——8.图像内容分类】

python计算机视觉编程——8.图像内容分类 8.图像内容分类8.1 K邻近分类法(KNN)8.1.1 一个简单的二维示例8.1.2 用稠密SIFT作为图像特征8.1.3 图像分类:手势识别 8.2贝叶斯分类器用PCA降维 8.3 支持向量机8.3.2 再论手势识别 8.4 光学字符识别8.4.2 选取特征8.4.3 多类支持向量机8.4.4 提取单元格并识别字符8.4.5 图像校正

解析apollo纵向控制标定表程序

百度apollo采用标定表描述车辆速度、加速度与油门/刹车之间的关系。该表可使无人车根据当前车速与期望加速度得到合适的油门/刹车开合度。除了文献《Baidu Apollo Auto-Calibration System - An Industry-Level Data-Driven and Learning based Vehicle Longitude Dynamic Calibrating

Python计算机视觉编程 第十章

目录 一、OpenCv基础知识 1.读取和写入图像 2.颜色空间 3.显示图像和结果 二、处理视频 1.输入视频 2.将视频读取到NumPy数组中 三、跟踪 1.光流 2.Lucas-Kanade算法 一、OpenCv基础知识 OpenCV 自带读取、写入图像函数以及矩阵操作和数学库。 1.读取和写入图像 import cv2# 读取图像im = c

机器视觉硬件选型根据某项目相机镜头

一 项目总需求 1、大视野检测需求: (1)大视野: ①产品尺寸15.6寸屏幕,产品大小:350mm x 225mm; ②产品料盘尺寸大小:565mm x 425mm; ③工作距离:880mm;检测精度:500μm; 1、大视野检测需求: (1)大视野: ①产品尺寸15.6寸屏幕,产品大小:350mm x 225mm; ②产品料盘尺寸大小:565mm x 425mm; 工作距离:

Midjourney 随机风格 (Style Random),开启奇幻视觉之旅

作者:老余捞鱼 原创不易,转载请标明出处及原作者。 写在前面的话:       Midjourney 最近推出了 "Style Random"(随机风格),这项功能可以让我们使用独特的随机 sref 代码创建图像,从而每次都能获得不同的美感。通过对这些功能的探索和尝试,我发现了一些很棒的风格,我很高兴能与大家分享,这样可以节省大家的时间,不用自己动手测试。在本文中,我将展示十个M

彩色成像的基础和应用 原理 Principles(四)人类视觉 修订版

由于此书覆盖的领域之巨大, 翻译此书是非常具有挑战性的工作,如有过错请谅解和指正。 【注:彩色成像的基础(二)讨论光的传播 (三)光与物质的相互作用 暂时未翻译完成】                  前面几章讨论了光及其与物质的相互作用。当光线进入人眼时,会发生一种特别重要的相互作用。光落在视网膜上,会引发一连串最引人注目的事件。在本章和下一章中,我们将根据目前的知识水平,重点讨论这一系列事件。