如何使用樹莓派制作一個數(shù)字針孔攝像頭
學習如何使用一個樹莓派 Zero、高清網絡攝像頭和一個空的粉盒來搭建一個簡單的相機。
在 2015 年底的時候,樹莓派基金會發(fā)布了一個讓大家很驚艷的非常小的 樹莓派 Zero。更夸張的是,他們隨 MagPi 雜志一起 免費贈送。我看到這個消息后立即沖出去到處找報刊亭,直到我在這一地區(qū)的某處找到最后兩份。實際上我還沒有想好如何去使用它們,但是我知道,因為它們非常小,所以,它們可以做很多全尺寸樹莓派沒法做的一些項目。
從 MagPi 雜志上獲得的樹莓派 Zero。CC BY-SA.4.0。
因為我對天文攝影非常感興趣,我以前還改造過一臺微軟出的 LifeCam Cinema 高清網絡攝像頭,拆掉了它的外殼、鏡頭、以及紅外濾鏡,露出了它的 CCD 芯片。我把它定制為我的 Celestron 天文望遠鏡的目鏡。用它我捕獲到了令人難以置信的木星照片、月球上的隕石坑、以及太陽黑子的特寫鏡頭(使用了適當?shù)?Baader 安全保護膜)。
在那之前,我甚至還在我的使用膠片的 SLR 攝像機上,通過在鏡頭蓋(這個蓋子就是在攝像機上沒有安裝鏡頭時,用來保護攝像機的內部元件的那個蓋子)上鉆一個小孔來變成一個 針孔攝像機,將這個鉆了小孔的蓋子,蓋到一個汽水罐上切下來的小圓盤上,以提供一個針孔。碰巧有一天,這個放在我的桌子上的針孔鏡頭蓋被改成了用于天文攝像的網絡攝像頭。我很好奇這個網絡攝像頭是否有從針孔蓋子后面捕獲低照度圖像的能力。我花了一些時間使用 GNOME Cheese 應用程序,去驗證這個針孔攝像頭確實是個可行的創(chuàng)意。
自從有了這個想法,我就有了樹莓派 Zero 的一個用法!針孔攝像機一般都非常小,除了曝光時間和膠片的 ISO 速率外,一般都不提供其它的控制選項。數(shù)字攝像機就不一樣了,它至少有 20 多個按鈕和成百上千的設置菜單。我的數(shù)字針孔攝像頭的目標是真實反映天文攝像的傳統(tǒng)風格,設計一個沒有控制選項的極簡設備,甚至連曝光時間控制也沒有。
用樹莓派 Zero、高清網絡鏡頭和空的粉盒設計的數(shù)字針孔攝像頭,是我設計的 一系列 針孔攝像頭的 第一個項目?,F(xiàn)在,我們開始來制作它。
硬件
因為我手頭已經有了一個樹莓派 Zero,為完成這個項目我還需要一個網絡攝像頭。這個樹莓派 Zero 在英國的零售價是 4 英磅,這個項目其它部件的價格,我希望也差不多是這樣的價格水平?;ㄙM 30 英磅買來的攝像頭安裝在一個 4 英磅的計算機主板上,讓我感覺有些不平衡。顯而易見的答案是前往一個知名的拍賣網站上,去找到一些二手的網絡攝像頭。不久之后,我僅花費了 1 英磅再加一些運費,獲得了一個普通的高清攝像頭。之后,在 Fedora 上做了一些測試操作,以確保它是可用正常使用的,我拆掉了它的外殼,以檢查它的電子元件的大小是否適合我的項目。
Hercules DualPix 高清網絡攝像頭,它將被解剖以提取它的電路板和 CCD 圖像傳感器。CC BY-SA 4.0.
接下來,我需要一個安放攝像頭的外殼。樹莓派 Zero 電路板大小僅僅為 65mm x 30mm x 5mm。雖然網絡攝像頭的 CCD 芯片周圍有一個用來安裝鏡頭的塑料支架,但是,實際上它的電路板尺寸更小。我在家里找了一圈,希望能夠找到一個適合盛放這兩個極小的電路板的容器。最后,我發(fā)現(xiàn)我妻子的粉盒足夠去安放樹莓派的電路板。稍微做一些小調整,似乎也可以將網絡攝像頭的電路板放進去。
變成我的針孔攝像頭外殼的粉盒。CC BY-SA 4.0.
我拆掉了網絡攝像頭外殼上的一些螺絲,取出了它的內部元件。網絡攝像頭外殼的大小反映了它的電路板的大小或 CCD 的位置。我很幸運,這個網絡攝像頭很小而且它的電路板的布局也很方便。因為我要做一個針孔攝像頭,我需要取掉鏡頭,露出 CCD 芯片。
它的塑料外殼大約有 1 厘米高,它太高了沒有辦法放進粉盒里。我拆掉了電路板后面的螺絲,將它完全拆開,我認為將它放在盒子里有助于阻擋從縫隙中來的光線,因此,我用一把工藝刀將它修改成 4 毫米高,然后將它重新安裝。我折彎了 LED 的支腳以降低它的高度。最后,我切掉了安裝麥克風的塑料管,因為我不想采集聲音。
取下鏡頭以后,就可以看到裸露的 CCD 芯片了。圓柱形的塑料柱將鏡頭固定在合適的位置上,并阻擋 LED 光進入鏡頭破壞圖像。CC BY-SA 4.0
網絡攝像頭有一個很長的帶全尺寸插頭的 USB 線纜,而樹莓派 Zero 使用的是一個 Micro-USB 插座,因此,我需要一個 USB 轉 Micro-USB 的適配器。但是,使用適配器插入,這個樹莓派將放不進這個粉盒中,更不用說還有將近一米長的 USB 線纜。因此,我用刀將 Micro-USB 適配器削開,切掉了它的 USB 插座并去掉這些塑料,露出連接到 Micro-USB 插頭上的金屬材料。同時也把網絡攝像頭的 USB 電纜切到大約 6 厘米長,并剝掉裹在它外面的錫紙,露出它的四根電線。我把它們直接焊接到 Micro-USB 插頭上?,F(xiàn)在網絡攝像頭可以插入到樹莓派 Zero 上了,并且電線也可以放到粉盒中了。
網絡攝像頭使用的 Micro-USB 插頭已經剝掉了線,并直接焊接到觸點上。這個插頭現(xiàn)在插入到樹莓派 Zero 后大約僅高出樹莓派 1 厘米。CC BY-SA 4.0
最初,我認為到此為止,已經全部完成了電子設計部分,但是在測試之后,我意識到,如果攝像頭沒有捕獲圖像或者甚至沒有加電我都不知道。我決定使用樹莓派的 GPIO 針腳去驅動 LED 指示燈。一個黃色的 LED 表示網絡攝像頭控制軟件已經運行,而一個綠色的 LED 表示網絡攝像頭正在捕獲圖像。我在 BCM 的 17 號和 18 號針腳上各自串接一個 300 歐姆的電阻,并將它們各自連接到 LED 的正極上,然后將 LED 的負極連接到一起并接入到公共地針腳上。
LED 使用一個 300 歐姆的電阻連接到 GPIO 的 BCM 17 號和 BCM 18 號針腳上,負極連接到公共地針腳。CC BY-SA 4.0.
接下來,該去修改粉盒了。首先,我去掉了卡在粉盒上的托盤以騰出更多的空間,并且用刀將連接處切開。我打算在一個便攜式充電寶上運行樹莓派 Zero,充電寶肯定是放不到這個盒子里面,因此,我挖了一個孔,這樣就可以引出 USB 連接頭。LED 的光需要能夠從盒子外面看得見,因此,我在蓋子上鉆了兩個 3 毫米的小孔。
然后,我使用一個 6 毫米的鉆頭在蓋子的底部中間處鉆了一個孔,并找了一個薄片蓋在它上面,然后用針在它的中央扎了一個小孔。一定要確保針尖很細,因為如果插入整個針會使孔太大。我使用干/濕砂紙去打磨這個針孔,以讓它更光滑,然后從另一面再次打孔,再強調一次僅使用針尖。使用針孔攝像頭的目的是為了得到一個規(guī)則的、沒有畸形或凸起的圓孔,并且勉強讓光通過??自叫?,圖像越銳利。
帶針孔的盒子底部。CC BY-SA 4.0
剩下的工作就是將這些已經改造完成的設備封裝起來。首先我使用藍色膩子將攝像頭的電路板固定在盒子中合適的位置,這樣針孔就直接處于 CCD 之上了。使用藍色膩子的好處是,如果我需要清理污漬(或者如果放錯了位置)時,就可以很容易地重新安裝 CCD 了。將樹莓派 Zero 直接放在攝像頭電路板上面。為防止這兩個電路板之間可能出現(xiàn)的短路情況,我在樹莓派的背面貼了幾層防靜電膠帶。
樹莓派 Zero 非常適合放到這個粉盒中,并且不需要任何固定,而從小孔中穿出去連接充電寶的 USB 電纜需要將它粘住固定。最后,我將 LED 塞進了前面在盒子上鉆的孔中,并用膠水將它們固定住。我在 LED 的針腳之中放了一些防靜電膠帶,以防止盒子蓋上時,它與樹莓派電路板接觸而發(fā)生短路。
樹莓派 Zero 塞入到這個盒子中后,周圍的空隙不到 1mm。從盒子中引出的連接到網絡攝像頭上的 Micro-USB 插頭,接下來需要將它連接到充電寶上。CC BY-SA 4.0
軟件
當然,計算機硬件離開控制它的軟件是不能使用的。樹莓派 Zero 同樣可以運行全尺寸樹莓派能夠運行的軟件,但是,因為樹莓派 Zero 的 CPU 速度比較慢,讓它去引導傳統(tǒng)的 Raspbian OS 鏡像非常耗時。打開攝像頭都要花費差不多一分鐘的時間,這樣的速度在現(xiàn)實中是沒有什么用處的。而且,一個完整的樹莓派操作系統(tǒng)對我的這個攝像頭項目來說也沒有必要。甚至是,我禁用了引導時啟動的所有可禁用的服務,啟動仍然需要很長的時間。因此,我決定僅使用需要的軟件,我將用一個 U-Boot 引導加載器和 Linux 內核。自定義 init
二進制文件從 microSD 卡上加載 root 文件系統(tǒng)、讀入驅動網絡攝像頭所需要的內核模塊,并將它放在 /dev
目錄下,然后運行二進制的應用程序。
這個二進制的應用程序是另一個定制的 C 程序,它做的核心工作就是管理攝像頭。首先,它等待內核驅動程序去初始化網絡攝像頭、打開它、以及通過低級的 v4l ioctl
調用去初始化它。GPIO 針配置用來通過 /dev/mem
寄存器去驅動 LED。
初始化完成之后,攝像頭進入一個循環(huán)。每個圖像捕獲循環(huán)是攝像頭使用缺省配置,以 JPEG 格式捕獲一個單一的圖像幀、保存這個圖像幀到 SD 卡、然后休眠三秒。這個循環(huán)持續(xù)運行直到斷電為止。這已經很完美地實現(xiàn)了我的最初目標,那就是用一個傳統(tǒng)的模擬的針孔攝像頭設計一個簡單的數(shù)字攝像頭。
定制的用戶空間 代碼 在遵守 GPLv3 或者更新版許可下自由使用。樹莓派 Zero 需要 ARMv6 的二進制文件,因此,我使用了 QEMU ARM 模擬器在一臺 x86_64 主機上進行編譯,它使用了 Pignus 發(fā)行版(一個針對 ARMv6 移植/重構建的 Fedora 23 版本)下的工具鏈,在 chroot
環(huán)境下進行編譯。所有的二進制文件都靜態(tài)鏈接了 glibc,因此,它們都是自包含的。我構建了一個定制的 RAMDisk 去包含這些二進制文件和所需的內核模塊,并將它拷貝到 SD 卡,這樣引導加載器就可以找到它們了。
最終完成的攝像機完全隱藏在這個粉盒中了。唯一露在外面的東西就是 USB 電纜。CC BY-SA 4.0
照像
軟件和硬件已經完成了,是該去驗證一下它能做什么了。每個人都熟悉用現(xiàn)代的數(shù)字攝像頭拍攝的高質量圖像,不論它是用專業(yè)的 DSLRs 還是移動電話拍的。但是,這個高清的 1280x1024 分辨率的網絡攝像頭(差不多是一百萬像素),在這里可能會讓你失望。這個 CCD 從一個光通量極小的針孔中努力捕獲圖像。網絡攝像頭自動提升增益和曝光時間來進行補償,最后的結果是一幅噪點很高的圖像。圖像的動態(tài)范圍也非常窄,從一個非常擁擠的柱狀圖就可以看出來,這可以通過后期處理來拉長它,以得到更真實的亮部和暗部。
在戶外陽光充足時捕獲的圖像達到了最佳效果,因此在室內獲得的圖像大多數(shù)都是不可用的圖像。它的 CCD 直徑僅有大約 1cm,并且是從一個幾毫米的針孔中來捕獲圖像的,它的視界相當窄。比如,在自拍時,手臂拿著相機盡可能伸長,所獲得的圖像也就是充滿整個畫面的人頭。最后,圖像都是失焦的,所有的針孔攝像機都是這樣的。
在倫敦,大街上的屋頂。CC BY-SA 4.0
范堡羅機場的老航站樓。CC BY-SA 4.0
最初,我只是想使用攝像頭去捕獲一些靜態(tài)圖像。后面,我降低了循環(huán)的延遲時間,從三秒改為一秒,然后用它捕獲一段時間內的一系列圖像。我使用 GStreamer 將這些圖像做成了延時視頻。
以下是我創(chuàng)建視頻的過程:
視頻是我在某天下班之后,從銀行沿著泰晤式河到滑鐵盧的畫面。以每分鐘 40 幀捕獲的 1200 幀圖像被我制作成了每秒 20 幀的動畫。