立體(3D)流攝像機和觀看器——第2部分
在這個項目的第一個版本中,我創(chuàng)建了一個三腳架安裝的立體3D相機,它通過HTTP傳輸立體視頻流,這樣它就可以在谷歌Cardboard這樣的立體觀看器上觀看。在這個設(shè)置中,我使用了兩臺Raspberry Pi zero,每個都有自己的攝像頭。
在這個更新的項目中,我使用樹莓派5,它有兩個攝像頭插槽,因此可以在單板上容納兩個攝像頭。
代碼也已更新,以利用新的PiCamera2 python庫。版本1使用了PiCamera,因為最新的樹莓派操作系統(tǒng)仍然沒有python支持libcamera。更新后的代碼支持兩種設(shè)置-使用2板,2攝像頭設(shè)置樹莓派零或1板,2攝像頭設(shè)置樹莓派5。它還利用Javascript來防止屏幕自動鎖定。
在這個項目中,我將主要關(guān)注Raspberry Pi 5的設(shè)置。您可以參考前面的項目了解Raspberry Pi Zero安裝的具體細節(jié),包括將它們安裝在機箱上并共享電源軌,因此兩者都可以通過單個電源適配器供電。
立體3D圖像/視頻試圖復制我們親眼所見的東西。你的雙眼相距約2.5英寸或6厘米(60毫米)(也稱為眼間距離)。因此,每只眼睛從略微不同的角度和角度看圖像。大腦將這兩個圖像結(jié)合成一個無縫的圖像,并利用這些信息來測量距離和深度。這也被稱為雙目視覺。
我們可以用一個3D立體攝像機來復制這個過程,用兩個相距大致眼間距離的攝像機。這兩幅圖像(左圖和右圖)然后使用谷歌Cardboard等立體觀看器分別呈現(xiàn)給每只眼睛。然后,大腦將這些圖像結(jié)合起來,處理視角和角度的細微差異,從而產(chǎn)生深度感知,即3D圖像!
在這個項目中,我用一個樹莓派5和兩個樹莓派相機2s建立了一個立體3D相機,安置在樹莓派3/4/5的ProtoStax外殼中。
我也使用ProtoStax立體3D相機套件樹莓派相機- 60mm立體底座,它允許你安裝兩個Pi相機2坐落,你猜它相隔60mm -我們的眼間距離(也稱為軸間距離或立體底座時,參考相機設(shè)置)!它還配備了一個三腳架安裝件,使整個外殼三腳架安裝。
我們將使用Python將來自兩個攝像頭的攝像頭輸出流式傳輸?shù)交谧笱?右眼瀏覽器的復合視頻流中。然后,您可以在手機上的瀏覽器上打開這個立體聲視頻流,并將其放置在谷歌Cardboard等立體觀看器中,然后voilom !-我們有我們的3D立體流媒體相機和查看器!
現(xiàn)在,你可以給你的奶奶或奶奶帶一個3D參觀你的房子,而不必讓他們爬樓梯或離開舒適的椅子,因為你去操作相機,讓他們遠程觀看!
或者玩一些愚蠢的3D游戲,你可以讓你的朋友或家人看到你通過谷歌Cardboard呈現(xiàn)的世界——轉(zhuǎn)動相機,對準他們,看看他們在3D中看到自己時的反應(yīng)!很迷糊了!
免責聲明-暈動病患者在觀看VR頭顯或立體相機時可能會感到有點惡心。如果你開始感到惡心,只要放松立體相機觀看!
另一個免責聲明-兩個攝像機不是同步在這里,這個項目不是用于硬核立體視頻使用。為此,您可以使用其他硬件,例如Arducam的同步立體相機HAT用于樹莓派(或來自Arducam的其他類似產(chǎn)品)。ProtoStax外殼有足夠的空間放置HAT,因此您可以升級項目以使用硬件同步攝像機。您還可以嘗試使用軟件技術(shù)來改進性能和同步。在“前進”一節(jié)中提到了如何改進這個項目。
好了,我們開始吧!
第一步:準備樹莓派
如果您是從頭開始,您需要首先為您的樹莓派5配置SD卡和樹莓派操作系統(tǒng)。Raspberry Pi Imager工具允許您在創(chuàng)建啟動映像時提前進行一些配置。
由于我們將在無頭設(shè)置中使用樹莓派(未連接到顯示器或電視),因此您需要在它們上啟用SSH。我們還希望它們在啟動時直接連接到無線網(wǎng)絡(luò)。我們可以使用樹莓派Imager工具設(shè)置提供WIFI網(wǎng)絡(luò)名稱和密碼憑證。
一旦我們這樣做了,我們可以做其余的設(shè)置稍后,在我們啟動我們的立體流媒體相機硬件設(shè)置。我們可以SSH到Raspberry Pi,并完成其余的設(shè)置,包括獲取源代碼和運行程序。
步驟2:設(shè)置硬件
首先將樹莓派5安裝在樹莓派5 / 4 / 3型號B/B+的ProtoStax機箱上。
接下來,安裝樹莓派相機的頂部板的ProtoStax立體3D相機套件樹莓派相機。
將Pi相機安裝到頂板上
連接相機線到樹莓派5?;蛘?,您可以在將相機安裝到頂板之前將相機連接到樹莓派5上!只要你覺得容易就行!
離以太網(wǎng)接口最近的攝像機槽位為camera 0。它旁邊的插槽(靠近HDMI端口)是相機1。在我的設(shè)置中,我將右攝像頭連接到槽0,將左攝像頭連接到槽1。如果您交換了它們,只需適當?shù)馗麓a。
添加側(cè)壁(包括一個/兩個三腳架安裝側(cè)壁從ProtoStax立體3D相機套件樹莓派相機),并關(guān)閉一切。
完成外殼與三腳架安裝
這是最后完成立體相機設(shè)置,與附加的三腳架安裝適配器板(這將完全取決于你有三腳架的類型!)。
步驟3:配置樹莓派
使用最新的樹莓派和樹莓派操作系統(tǒng),你不需要做很多額外的配置。之前,您需要使用raspi-config啟用相機接口?,F(xiàn)在,當攝像頭連接到接口上時,它們會自動啟用。
步驟4:配置軟件
你可以從GitHub下載該軟件。或者,您可以使用git安裝它
該程序?qū)⑼ㄟ^一個簡單的web服務(wù)器暴露相機的兩個MJPG視頻流,如:
(*將上面的raspberrypi5替換為您為pi選擇的主機名)
該程序還有一個主頁(index.html),將兩個視頻流顯示為立體圖像(并排),如
您可以打開手機瀏覽器上的鏈接(只需確保您的手機與樹莓派在同一網(wǎng)絡(luò)上),并將手機放在谷歌Cardboard(或類似的查看器)等3D立體查看器中,以便在您的查看器上獲得3D立體流媒體相機。
因此,觀眾可以看到3D的一切。攝像機操作員可以四處移動,讓觀眾從舒適的沙發(fā)上享受3D之旅!
第五步:調(diào)焦相機和其他技巧
為了獲得最佳性能,您可以對焦樹莓派相機2的鏡頭,以獲得更清晰的圖像。您可以使用樹莓派相機的鏡頭調(diào)整工具來輕松調(diào)整焦點。
為了獲得最佳的流媒體性能,請確保您的樹莓派上沒有運行太多其他程序或服務(wù)。如果您從SD卡圖像開始,這應(yīng)該不是問題。但是,如果您從已經(jīng)配置的現(xiàn)有樹莓派開始,請確保您已經(jīng)停止并禁用了額外的服務(wù),因此流媒體性能不會受到影響。
當您在手機上的瀏覽器上打開立體流鏈接時,最好隱藏工具欄,這樣查看器中的無關(guān)元素就會最小化。您需要在查看器中橫向調(diào)整手機,以便圖像顯示為單個平滑的3D圖像(并且沒有模糊的偽影)。
更新后的代碼在這個項目也可以防止屏幕鎖定踢在一段時間后,這將發(fā)生如果手機被放置在谷歌紙板查看器-只需點擊“喚醒鎖定被禁用”按鈕啟用它!當它被啟用時,背景變?yōu)楹谏?
代碼
這個代碼是基于Picamera庫的Web視頻流的高級配方,它開始將相機的視頻流記錄到緩沖區(qū),然后通過http請求處理程序提供幀。它已經(jīng)更新為在最新版本的樹莓派操作系統(tǒng)上使用PiCamera2。web服務(wù)器在端口8000上啟動。您可以使用raspberrypi5.local:8000/leftstream查看每個相機的每個單獨的mjpg流?;騬aspberrypi5.local:8000/rightstream.mjpg
這個簡單的web服務(wù)器將使用一些HTML和CSS將左右mjpg流配置為帶有拆分視圖的單個頁面,并提供對主頁請求的響應(yīng)(raspberypi5)。本地:8000/或index.html頁面(raspberrypi5.local:8000/index.html)。因此打開主頁將提供一個立體視頻流。
下面是用來格式化頁面的HTML和CSS:
它利用了richtr的NoSleep.js javascript庫來防止手機屏幕在一段時間不活動后自動鎖定,這將發(fā)生在手機處于谷歌Cardboard Viewer中時。在版本1中,我建議你使用手機的設(shè)置關(guān)閉自動鎖定功能。更新后的代碼使其更方便,更易于使用。
代碼也有另一個HTML/CSS設(shè)置為2攝像頭,2 Pi零設(shè)置,結(jié)合流從左攝像頭。本地和右凸輪。本地pi(更新名稱以匹配您的設(shè)置)。
為了使代碼在啟動時自動運行,您需要將其作為服務(wù)運行。GitHub頁面的README有關(guān)于如何做到這一點的說明,包括服務(wù)的配置文件。
展望未來:
和往常一樣,我想在結(jié)束時談?wù)勅绾斡米约旱难a充來推進這個項目!一旦您熟悉了代碼示例并理解了代碼,嘗試通過做更多的事情來擴展您的學習總是好的。以下是一些建議:
?在Pi上將python流程序作為服務(wù)運行,這樣它就會在Pi啟動時自動啟動。GitHub鏈接有關(guān)于如何做到這一點的說明。
?我們目前使用MJPEG格式流媒體視頻。使用MPEG1或其他可能提供更好性能的格式進行流式傳輸
?添加拍攝立體照片的功能——在樹莓派的GPIO上添加一個按鈕,并使用該按鈕從兩個相機中拍攝左右照片,并將它們拼接在一起,形成立體二人組
本文編譯自hackster.io