在这个项目的第一个版本中,我创建了一个三脚架安装的立体3D相机,它通过HTTP传输立体视频流,这样它就可以在谷歌Cardboard这样的立体观看器上观看。在这个设置中,我使用了两台Raspberry Pi zero,每个都有自己的摄像头。
在这个更新的项目中,我使用树莓派5,它有两个摄像头插槽,因此可以在单板上容纳两个摄像头。
代码也已更新,以利用新的PiCamera2 python库。版本1使用了PiCamera,因为最新的树莓派操作系统仍然没有python支持libcamera。更新后的代码支持两种设置-使用2板,2摄像头设置树莓派零或1板,2摄像头设置树莓派5。它还利用Javascript来防止屏幕自动锁定。
在这个项目中,我将主要关注Raspberry Pi 5的设置。您可以参考前面的项目了解Raspberry Pi Zero安装的具体细节,包括将它们安装在机箱上并共享电源轨,因此两者都可以通过单个电源适配器供电。
立体3D图像/视频试图复制我们亲眼所见的东西。你的双眼相距约2.5英寸或6厘米(60毫米)(也称为眼间距离)。因此,每只眼睛从略微不同的角度和角度看图像。大脑将这两个图像结合成一个无缝的图像,并利用这些信息来测量距离和深度。这也被称为双目视觉。
我们可以用一个3D立体摄像机来复制这个过程,用两个相距大致眼间距离的摄像机。这两幅图像(左图和右图)然后使用谷歌Cardboard等立体观看器分别呈现给每只眼睛。然后,大脑将这些图像结合起来,处理视角和角度的细微差异,从而产生深度感知,即3D图像!
在这个项目中,我用一个树莓派5和两个树莓派相机2s建立了一个立体3D相机,安置在树莓派3/4/5的ProtoStax外壳中。
我也使用ProtoStax立体3D相机套件树莓派相机- 60mm立体底座,它允许你安装两个Pi相机2坐落,你猜它相隔60mm -我们的眼间距离(也称为轴间距离或立体底座时,参考相机设置)!它还配备了一个三脚架安装件,使整个外壳三脚架安装。
我们将使用Python将来自两个摄像头的摄像头输出流式传输到基于左眼/右眼浏览器的复合视频流中。然后,您可以在手机上的浏览器上打开这个立体声视频流,并将其放置在谷歌Cardboard等立体观看器中,然后voilom !-我们有我们的3D立体流媒体相机和查看器!
现在,你可以给你的奶奶或奶奶带一个3D参观你的房子,而不必让他们爬楼梯或离开舒适的椅子,因为你去操作相机,让他们远程观看!
或者玩一些愚蠢的3D游戏,你可以让你的朋友或家人看到你通过谷歌Cardboard呈现的世界——转动相机,对准他们,看看他们在3D中看到自己时的反应!很迷糊了!
免责声明-晕动病患者在观看VR头显或立体相机时可能会感到有点恶心。如果你开始感到恶心,只要放松立体相机观看!
另一个免责声明-两个摄像机不是同步在这里,这个项目不是用于硬核立体视频使用。为此,您可以使用其他硬件,例如Arducam的同步立体相机HAT用于树莓派(或来自Arducam的其他类似产品)。ProtoStax外壳有足够的空间放置HAT,因此您可以升级项目以使用硬件同步摄像机。您还可以尝试使用软件技术来改进性能和同步。在“前进”一节中提到了如何改进这个项目。
好了,我们开始吧!
第一步:准备树莓派
如果您是从头开始,您需要首先为您的树莓派5配置SD卡和树莓派操作系统。Raspberry Pi Imager工具允许您在创建启动映像时提前进行一些配置。
由于我们将在无头设置中使用树莓派(未连接到显示器或电视),因此您需要在它们上启用SSH。我们还希望它们在启动时直接连接到无线网络。我们可以使用树莓派Imager工具设置提供WIFI网络名称和密码凭证。
一旦我们这样做了,我们可以做其余的设置稍后,在我们启动我们的立体流媒体相机硬件设置。我们可以SSH到Raspberry Pi,并完成其余的设置,包括获取源代码和运行程序。
步骤2:设置硬件
首先将树莓派5安装在树莓派5 / 4 / 3型号B/B+的ProtoStax机箱上。
接下来,安装树莓派相机的顶部板的ProtoStax立体3D相机套件树莓派相机。
将Pi相机安装到顶板上
连接相机线到树莓派5。或者,您可以在将相机安装到顶板之前将相机连接到树莓派5上!只要你觉得容易就行!
离以太网接口最近的摄像机槽位为camera 0。它旁边的插槽(靠近HDMI端口)是相机1。在我的设置中,我将右摄像头连接到槽0,将左摄像头连接到槽1。如果您交换了它们,只需适当地更新代码。
添加侧壁(包括一个/两个三脚架安装侧壁从ProtoStax立体3D相机套件树莓派相机),并关闭一切。
完成外壳与三脚架安装
这是最后完成立体相机设置,与附加的三脚架安装适配器板(这将完全取决于你有三脚架的类型!)。
步骤3:配置树莓派
使用最新的树莓派和树莓派操作系统,你不需要做很多额外的配置。之前,您需要使用raspi-config启用相机接口。现在,当摄像头连接到接口上时,它们会自动启用。
步骤4:配置软件
你可以从GitHub下载该软件。或者,您可以使用git安装它
该程序将通过一个简单的web服务器暴露相机的两个MJPG视频流,如:
(*将上面的raspberrypi5替换为您为pi选择的主机名)
该程序还有一个主页(index.html),将两个视频流显示为立体图像(并排),如
您可以打开手机浏览器上的链接(只需确保您的手机与树莓派在同一网络上),并将手机放在谷歌Cardboard(或类似的查看器)等3D立体查看器中,以便在您的查看器上获得3D立体流媒体相机。
因此,观众可以看到3D的一切。摄像机操作员可以四处移动,让观众从舒适的沙发上享受3D之旅!
第五步:调焦相机和其他技巧
为了获得最佳性能,您可以对焦树莓派相机2的镜头,以获得更清晰的图像。您可以使用树莓派相机的镜头调整工具来轻松调整焦点。
为了获得最佳的流媒体性能,请确保您的树莓派上没有运行太多其他程序或服务。如果您从SD卡图像开始,这应该不是问题。但是,如果您从已经配置的现有树莓派开始,请确保您已经停止并禁用了额外的服务,因此流媒体性能不会受到影响。
当您在手机上的浏览器上打开立体流链接时,最好隐藏工具栏,这样查看器中的无关元素就会最小化。您需要在查看器中横向调整手机,以便图像显示为单个平滑的3D图像(并且没有模糊的伪影)。
更新后的代码在这个项目也可以防止屏幕锁定踢在一段时间后,这将发生如果手机被放置在谷歌纸板查看器-只需点击“唤醒锁定被禁用”按钮启用它!当它被启用时,背景变为黑色。
代码
这个代码是基于Picamera库的Web视频流的高级配方,它开始将相机的视频流记录到缓冲区,然后通过http请求处理程序提供帧。它已经更新为在最新版本的树莓派操作系统上使用PiCamera2。web服务器在端口8000上启动。您可以使用raspberrypi5.local:8000/leftstream查看每个相机的每个单独的mjpg流。或raspberrypi5.local:8000/rightstream.mjpg
这个简单的web服务器将使用一些HTML和CSS将左右mjpg流配置为带有拆分视图的单个页面,并提供对主页请求的响应(raspberypi5)。本地:8000/或index.html页面(raspberrypi5.local:8000/index.html)。因此打开主页将提供一个立体视频流。
下面是用来格式化页面的HTML和CSS:
它利用了richtr的NoSleep.js javascript库来防止手机屏幕在一段时间不活动后自动锁定,这将发生在手机处于谷歌Cardboard Viewer中时。在版本1中,我建议你使用手机的设置关闭自动锁定功能。更新后的代码使其更方便,更易于使用。
代码也有另一个HTML/CSS设置为2摄像头,2 Pi零设置,结合流从左摄像头。本地和右凸轮。本地pi(更新名称以匹配您的设置)。
为了使代码在启动时自动运行,您需要将其作为服务运行。GitHub页面的README有关于如何做到这一点的说明,包括服务的配置文件。
展望未来:
和往常一样,我想在结束时谈谈如何用自己的补充来推进这个项目!一旦您熟悉了代码示例并理解了代码,尝试通过做更多的事情来扩展您的学习总是好的。以下是一些建议:
•在Pi上将python流程序作为服务运行,这样它就会在Pi启动时自动启动。GitHub链接有关于如何做到这一点的说明。
•我们目前使用MJPEG格式流媒体视频。使用MPEG1或其他可能提供更好性能的格式进行流式传输
•添加拍摄立体照片的功能——在树莓派的GPIO上添加一个按钮,并使用该按钮从两个相机中拍摄左右照片,并将它们拼接在一起,形成立体二人组
本文编译自hackster.io