![](https://filescdn.proginn.com/4bba264a6e1ad0001d0b6573d1f7367a/53e9c708e43440630201445bb71e2db1.webp)
本文约3000字,建议阅读6分钟
本文我们将学习如何创建一个定制的低成本立体摄像机。
标签:3D计算机视觉,摄像机标定,经典计算机视觉,入门指南,OAK
在本文中,我们将学习如何创建一个定制的低成本立体摄像机(使用一对网络摄像头),并使用它通过用OpenCV捕捉3D视频。我们提供Python和C++的代码。https://www.youtube.com/channel/UChlS_iGCul2Osw3wPT_k1Ig )我们都已经看完了上面那样的3D电影和视频,你需要红色-青色的3D眼镜(如图1)来体验3D的效果。它是如何起作用的?当屏幕只是平面时,我们如何体验3D效果?它们都是用安装好的立体摄像机拍摄的。![](https://filescdn.proginn.com/a80a6fde862ceccbb086ebd66e4a91c9/27d66a5b3a1598e07c8881f91623bf19.webp)
图1——红色-青色3D眼镜
在上一篇文章中,我们学习了什么是立体摄像机以及它们如何用来帮助计算机进行感知深度的内容。在本文中,我们学习制作自己的立体摄像机,并且理解其如何用来创建3D视频。具体而言,你将学习以下内容:
![](https://filescdn.proginn.com/9dadf10998ab1dc8d115666bb13c0fcd/08f12a373b9927fd2ea6eaf68e8454a0.webp)
安装立体摄像机的步骤
一个立体摄像机通常包含两个相距固定距离的相同摄像头。工业级别标准立体摄像机设备是使用一对相同的摄像头。2. 固定摄像头的刚性底座(木头,纸板,PVC泡沫板)。人们可以创造性地使用不同的部件来组装立体摄像机,但基本要求是要保持摄像头刚性固定和平行。![](https://filescdn.proginn.com/d5953f2abcd6e1e810eff506327f5eb3/c3c4a8900ad71806589250cbeb7ccc08.webp)
图2——我的DIY立体摄像机(左)和带有深度处理能力的OpenCV AI套件(OAK-D)(右)的图片。在OAKD两侧的两个摄像头构成了立体摄像机的设置。OAK-D的图片来源:https://luxonis.com/depthai# .
许多人已经创建并且分享了他们的DIY立体摄像机设置,如图2左边展示的我的分享,或是在这篇文章中分享的那个。(https://medium.com/@omar.ps16/stereo-3d-reconstruction-with-opencv-using-an-iphone-camera-part-iii-95460d3eddf0)
一旦我们固定好摄像头,并确保了它们正确校准,我们完工了吗?我们准备好生成视差图和3D视频了吗?立体标定和校正的重要性
为了理解立体标定和立体校正的重要性,我们尝试用由我们的立体设备拍摄的图片生成视差图,而不进行任何标定和立体校正。![](https://filescdn.proginn.com/edc4ae78d007ed22d6a50987ef6d8758/07e2cabcdc3e764e621f895f810dafb1.webp)
图3——左图和右图由立体摄像头设备拍摄
![](https://filescdn.proginn.com/9a4b541bfb11a592d5a930f87a7aa6fc/9e7a09663954c8aaa1de886b12a5d14f.webp)
图4——用左图和右图在没有立体标定的情况下产生的视差图
我们看到,由一个非标定立体摄像头设置生成的视差图是非常嘈杂而不准确。为什么会发生这种情况呢?基于上一篇文章,对应的关键点应具有相等的Y坐标以简化点对应搜索。在图5中,当绘制几个对应点之间的匹配线时,我们观察到那些线并不是完全水平的。![](https://filescdn.proginn.com/0678fddc7ca48087d8a8e7459d6c5f28/c08e035eba19442417d31785a42ab7f2.webp)
我们还能观察到对应点的Y坐标不相等。图6显示了一对具有对应点的立体图像,以及用这些图像生成的视差图。我们观察到现在的视差图与前一个相比噪声更小。在这种情况下,对应的关键点具有相等的Y坐标。只有当摄像头平行时,这种情况才可能发生。这是双视图几何体的特殊情况,图像是平行的,并且通过水平平移进行关联。这是必要的,因为这种生成视差图的方法仅在水平方向上搜索对应点的关系。![](https://filescdn.proginn.com/db531229eeb6e39e403276b3b40712cd/44964b958354a19f9452f78d994d480f.webp)
令人惊叹的!我们需要做的就是校准摄像头,并使它们完全平行。那么,我们是否要基于实验和错误手动调整摄像头呢?嗯,作为一个有趣的活动,你可以尝试它!剧透警告!!通过手动调整摄像头来获得一个清晰的视差图将花很长时间。而且,每次设置被干扰,摄像头被移位时,我们都不得不重复这个步骤。这是耗时间的,并不是一个理想的解决方法。与物理上调整摄像头不同,我们是在软件方面做这些。我们使用一个名叫立体图像校正的方法。[1]图7解释了立体校正的过程。该思想是将两张图重新投影到一个平行于穿过光学中心的的线的公共平面上。这确保了相应点有相同的Y坐标,并且仅通过水平平移进行关联。![](https://filescdn.proginn.com/6d50ba4e3466ea3a2527a2fd9a64ee44/f010f9056db9ab3a033293f7e9c9be56.webp)
(https://upload.wikimedia.org/wikipedia/commons/9/9a/Image_rectification.svg)立体标定和校正的步骤
基于我们之前关于镜头失真的文章,我们知道由摄像头拍摄的图片会受到镜头失真的影响。因此,除了立体校正,消除图像失真也是必要的。因此整个过程如下:1. 使用标准OpenCV标定方法(在摄像机标定文章中解释的)分别标定左右两个摄像头。3. 使用前面步骤中获得的参数和立体标定方法,我们确定两幅图像的变换以进行立体校正。4. 最后,使用InitUnderortRectiveyMap方法获得查找未失真和校正立体图像对所需的映射。5. 将该映射应用于原始图像,以获得校正后的无失真立体图像对。为了执行这些步骤,我们拍摄标定模式的图像。下面的视频展示了为了标定DIY立体相机而拍摄的不同图像。步骤1:分别标定立体设备的左右摄像头
视频展示了为立体标定拍摄图像的过程(阅读原文查看视频)
https://learnopencv.com/making-a-low-cost-stereo-camera-using-opencv/
在进行立体标定之前,我们对两个摄像头进行单独标定。但是,如果立体标定方法也可以标定两个摄像头中的每一个,我们为什么需要单独标定摄像头呢?因为要计算的参数很多(参数空间很大),并且在角点检测和将点近似为整数等步骤中也会累积误差。这会增加迭代方法偏离正解的可能性。因此,我们单独计算摄像机参数,并且stereoCalibrate()方法仅用于查找两个立体摄像头对之间的本征矩阵和基础矩阵之间的变换。但是算法stereoCalibrate()是如何知道要跳过单个摄像头的标定?对此我们设置了CALIB_FIX_INTRINSIC 标志。![](https://filescdn.proginn.com/aaedfb8be0e480d8cfa6759559a0ab77/5514ecc60ff2786881759186376c7024.webp)
![](https://filescdn.proginn.com/8d6910e9003b1a1c013da0c620d4502c/984e9d1cc4e86f452feb5b58ed128d19.webp)
![](https://filescdn.proginn.com/ff2a030e6ef88606e8c10d615d36b83d/5667ed6ed12aebf678aaad41742d929f.webp)
当摄像头被标定时,我们把它们传递到stereoCalibrate()方法中,并且设置CALIB_FIX_INTRINSIC标志。我们还传递在两幅图中捕获的3D点和对应的2D像素坐标。该方法计算了两个摄像头之间以及本征矩阵和基础矩阵之间的旋转和平移。![](https://filescdn.proginn.com/b7b499b8dd524a824c817cf57ba6cc13/766dbaf159bae3b8b0d001238638e0a6.webp)
![](https://filescdn.proginn.com/fccc346d4b891dbae7260ce8b72f5b04/fca2b62f0969612e6e266b8102ccb4ea.webp)
利用摄像头的内部特性以及摄像头之间的旋转和平移,我们现在可以应用立体校正。立体校正利用旋转来使两个摄影头图像平面位于同一平面中。除了旋转矩阵,立体校正方法还返回了新坐标空间中的投影矩阵。![](https://filescdn.proginn.com/5a5f8c69d48edcffb3fd26993266122a/517caf070d6d56805b449e35dea9df7d.webp)
![](https://filescdn.proginn.com/a376675ca6322a0295c2d98d5f1c9b74/99de932f64b3d9c78c3274d8522f6a00.webp)
步骤4:计算要求获得无失真的校正立体图像对的映射
因为我们假设摄像头是刚性固定的,所以无需再次计算变换。因此,我们计算将立体图像对转换为无失真校正立体图像对的映射,并存储它们以供进一步使用。![](https://filescdn.proginn.com/378603875f5322cc2ead753d30f12a34/591b856ea78ee8180ea35025f318644b.webp)
![](https://filescdn.proginn.com/ae7738f6a0bb84659fd669eef6df9198/2a804274996a655cba6ce63441dea291.webp)
一旦我们的DIY立体摄像机标定了,我们就可以创建3D视频了。但在我们了解如何制作3D视频之前,必须先了解3D眼镜的工作原理。我们用双目视觉系统感知世界。我们的眼睛处于横向不同的位置。因此,它们捕获了一些不同的信息。让我们做一个简单的实验!向前伸展你的手臂,并且手里拿着任一物品。现在,闭上一只眼睛看这个物体。一秒钟后,用另一只眼睛重复这个动作,并保持交替。你能观察到你的双眼所能看到的东西有什么不同吗?该差异主要在于物体的相对水平位置。这些位置差异称为水平视差。在上一篇文章中,我们使用一对立体图像计算了视差图。现在,把物体靠近你,并且重复同样的实验。你现在看到了什么变化?与物品相对应的水平视差增大。因此,物品的视差越大,它越靠近。这就是我们利用双目视觉系统,通过使用立体视觉来感知深度的方式。我们可以通过一种称为立体视法的方法,人为地向每只眼睛分别呈现两幅不同的图像来模拟这种差异。最初,对于3D电影,人们通过使用红色和青色滤镜对每只眼睛的图像进行编码来实现。他们使用了红色-青色3D眼镜,以确保两幅图像中的每一幅都能到达眼睛。这就产生了深度错觉。用这种方法产生的立体效果称为立体感3D。因此,这些图像被称为立体感图像,这些眼镜被称为立体感3D眼镜。创建一个自定义的3D视频
我们了解了如何将立体图像对转换为它的立体感图像,从而在使用立体感眼镜观看时产生深度错觉。但是我们如何捕捉这些立体图像呢?是的!这是我们使用DIY立体摄像机的地方。我们使用DIY立体摄像机设置捕捉立体图像,并为每个立体图像对创建一个立体感图像。然后,我们将所有连续的立体感图像保存为视频。这就是我们制作3D视频的方式!![](https://filescdn.proginn.com/22d8bc2ddaddb1d361dfc31ae857b3b6/a1d8bfb81206ab27cf15c291e8d15734.webp)
![](https://filescdn.proginn.com/21c7bc92e517036e5961430a7f623f76/ab0f1be22e553668bd167c1f2a9d3e51.webp)
使用定制的立体摄像机设置和上面解释的代码创建的3D视频(阅读原文查看视频)
https://learnopencv.com/making-a-low-cost-stereo-camera-using-opencv/
空间人工智能导论的第一篇文章讨论了与双视图几何和立体视觉相关的所有基本概念。这篇文章是关于创建一个低成本的立体摄像机设置,标定它,并使用它来创建自定义的3D电影。本系列的下一篇文章将讨论另一个激动人心的应用,并解释一些有关立体视觉的更基本的概念。参考文献
[1] C. Loop and Z. Zhang. Computing Rectifying Homographies for Stereo Vision. IEEE Conf. Computer Vision and Pattern Recognition, 1999.
原文标题:
Making A Low-Cost Stereo Camera Using OpenCV
原文地址:
https://learnopencv.com/making-a-low-cost-stereo-camera-using-opencv/
独家|OpenCV 1.1 Mat - 基本图像容器(附链接)
独家|OpenCV 1.3 矩阵的掩膜操作(附链接)
独家|OpenCV 1.5 利用OpenCV叠加(混合)两幅图像
独家|OpenCV 1.6 改变图像的对比度和亮度!
独家|OpenCV 1.7 离散傅里叶变换
独家|OpenCV1.8 使用XML和YAML文件实现文件的输入/输出
独家|OpenCV1.9 如何利用OpenCV的parallel_for_并行化代码(附代码)
独家|OpenCV1.10 使用OpenCV实现摄像头标定
顾伟嵩,中国科学院大学网络空间安全专业研究生。对数据科学领域充满好奇,渴望探索未知世界。课余时间喜欢踢足球、游泳。愿意挑战新事物,结交新朋友,一起进步,一起成长。
工作内容:需要一颗细致的心,将选取好的外文文章翻译成流畅的中文。如果你是数据科学/统计学/计算机类的留学生,或在海外从事相关工作,或对自己外语水平有信心的朋友欢迎加入翻译小组。
你能得到:定期的翻译培训提高志愿者的翻译水平,提高对于数据科学前沿的认知,海外的朋友可以和国内技术应用发展保持联系,THU数据派产学研的背景为志愿者带来好的发展机遇。
其他福利:来自于名企的数据科学工作者,北大清华以及海外等名校学生他们都将成为你在翻译小组的伙伴。
点击文末“阅读原文”加入数据派团队~
转载须知
如需转载,请在开篇显著位置注明作者和出处(转自:数据派ID:DatapiTHU),并在文章结尾放置数据派醒目二维码。有原创标识文章,请发送【文章名称-待授权公众号名称及ID】至联系邮箱,申请白名单授权并按要求编辑。
发布后请将链接反馈至联系邮箱(见下方)。未经许可的转载以及改编者,我们将依法追究其法律责任。