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