作者:the_anykey 翻譯:瑟瑟 校對:plantpark
Hi,
我是arduino和樹梅派的忠實粉絲,當然也喜歡3d打印。我想為我的孩子們做一個3d模型,然后就開始研究怎么去做一個3d掃描器,我找到了很多的解決方案,但是他們共有的問題是需要被掃描物體靜止一段時間,好吧 我想做一個宇宙飛船飛到火星也比讓我兩歲的兒子安靜得坐一段時間更加簡單。所以這些方案沒有一個可以用的。
我想必須想出一個辦法來可以同時拍到很多圖片,所以我開始找廉價的相機。如果我能找到廉價的相機,我想我可以用arduino做個自動觸發(fā)系統(tǒng),然后所有圖片會在還幾張sd卡里,但是我卻找不到廉價的數(shù)碼相機,然后我注意到樹梅派和相機模塊,一個性價比很高的模塊,可以用網(wǎng)線鏈接。所以我能通過網(wǎng)絡觸發(fā)相機拍照,并把所有圖片下載到一個地方,然后我的項目投資就開始了。
項目清單
-樹梅派 & PI camera *40
- 8 gb SD卡 *40
-一個60a 5v電源給所有樹梅派供電
-led燈條和12v電源
由于我不是一個有耐心的人,沒有一次性構建整個項目,我剛開始用了12個相機,這個結果已經(jīng)很棒了。如果只想得到一個人的面部,你并不需要40個相機。所以你并不需要40個相機,尤其在你只想得到一個人的面部。下面視頻是輸出結果:
第一步: 搭建設備
1.jpg (60.35 KB, 下載次數(shù): 805)
下載附件
【技術教程】樹莓派制作的3D掃描儀
2014-4-17 11:53 上傳
首先我需要做一個支撐樹梅派的平臺。最初我做了一個木制圓環(huán)做測試,但是這個不太實用并且很難進出。在一些測試之后,我想到了“單極”的設計。很多將照片轉換成3d模型的軟件里面都需要從不同角度拍攝。所以在每一個支架上裝了三個樹梅派相機
我用我的數(shù)控車床加工了2mm厚的合成木板做成一個支架,這讓我能轉2mm鉆孔來固定樹梅派,所以我只需要2.5mm的螺絲就能將樹梅派安裝到架子上
我為樹莓派相機設計了一個小巧并且方便打印的支架(因為我需要40個,所以我需要他們足夠。,既可以很好的固定相機,又可以簡單地調整相機角度
為了更加絢麗,我還每個支架上加了一米長的60個led的燈條,這樣既看起來很酷,又能為拍照補光。
第二步: 連接
連接40臺電腦的網(wǎng)線和電源線會看起來很亂,我想盡辦法讓它們看著更加簡潔。不幸的是樹莓派并不支持網(wǎng)線供電(POE),所以這些我得親自完成。我剪了40根5米長的網(wǎng)線。一樣長是為了方便我計算線上消耗的電壓并使其相等,這樣能夠方便的調節(jié)電源輸出電壓達到精確的5v
由于100MB網(wǎng)線只需要用到八根中的四根,所以我用了兩根作為樹莓派5v電源線。所以我需要80個(2*40)水晶頭,并使用八個中的六個(兩個沒用)。 我想說的是,這是整個工程里面最乏味最無聊的工作。
我買了一捆母接頭跳線,將他們切成兩半焊進水晶頭一邊的兩根里面,這樣可以很簡單的適用于樹莓派的5v接頭
另一方面 我為60a 5v電源做了一個電源擴展板,我可以簡單地連接上每一個以太網(wǎng)線上來的5v和地線
第三步: 軟件
我用的是Raspian OS,在樹莓派官網(wǎng)上默認下載。為了收集所有圖片,我用了一個中心文件服務器(我用了Qnap),我用cifs設置了樹莓派圖片連接到文件服務器,這在/etc/fstab 里面完成
我也用中心文件服務器來管理軟件,所以我不用手動更新每一個樹梅派。
在我完成系統(tǒng)鏡像的之后我用dd(在我的mac上)來為樹梅派克隆了40個sd。我想寫一個監(jiān)聽腳本讓每個樹梅派運行,監(jiān)聽特殊網(wǎng)絡廣播數(shù)據(jù)包來觸發(fā)相機,然后保存照片,拷貝到文件服務器上。因為我想將所有圖片保存在一個文件夾里(一次攝影一個文件夾),我用每個樹莓派的本地ip(最后三位)作為文件名的前。
這是我用的python做的監(jiān)聽腳本
#!/usr/bin/python
import socket
import struct
import fcntl
import subprocess
import sys
MCAST_GRP = '224.1.1.1'
MCAST_PORT = 5007
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(('', MCAST_PORT))
mreq = struct.pack("4sl", socket.inet_aton(MCAST_GRP), socket.INADDR_ANY)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
def get_ip_address(ifname):
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
return socket.inet_ntoa(fcntl.ioctl(
s.fileno(),
0×8915, # SIOCGIFADDR
struct.pack('256s', ifname[:15])
)[20:24])
id = get_ip_address('eth0')
ip1, ip2, ip3, ip4 = id.split('.')
print 'ID: ' ip4 '-'
optionfile = open('/server/options.cfg','r')
options = optionfile.readline()
optionfile.close()
print "optons: " options
while True:
data = sock.recv(10240)
data = data.strip()
if data == "reboot":
print "rebooting…"
cmd = 'sudo reboot'
pid = subprocess.call(cmd, shell=True)
elif data == "reload":
optionfile = open('/server/options.cfg','r')
options = optionfile.readline()
optionfile.close()
elif data == "restart":
cmd = '/server/reload.sh&'
pid = subprocess.call(cmd, shell=True)
else:
print "shooting " data
cmd = 'raspistill -o /tmp/photo.jpg ' options
pid = subprocess.call(cmd, shell=True)
print "creating directory"
cmd = 'mkdir /server/3dscan/' data
pid = subprocess.call(cmd, shell=True)
print "copy image"
cmd = 'cp /tmp/photo.jpg /server/3dscan/' data "/" data "_" ip4 '.jpg'
pid = subprocess.call(cmd, shell=True)
print "photo uploaded"
我寫了一個發(fā)送腳本來讓所有樹梅派開始拍照。這個腳本會詢問名字,這個名字作為文件名首字發(fā)送給樹梅派。這讓我可以知道圖片來自哪一個樹梅派。
這是python的發(fā)送腳本
import socket
import sys
import time
print 'photo name:'
n = sys.stdin.readline()
n = n.strip('\n')
MCAST_GRP = '224.1.1.1'
MCAST_PORT = 5007
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2)
sock.sendto(n, (MCAST_GRP, MCAST_PORT))
監(jiān)聽腳本用來確認接受命令,如果命令是reboot, reload or restart 他會執(zhí)行特殊動作,而不是拍照。
raspistill(樹梅派相機默認軟件)的配置選項我用了options.cfg文件來配置他,當然這也是存在中央文件服務器里面,所以我可以很簡單的來改變設置。
我做了些測試來看樹梅派是否同步拍攝照片,當他們同一時間接收網(wǎng)絡廣播是我覺得這做的很棒。我做了一個測試,12個相機組合同時拍攝我的iphone秒表,照片上的時間最多差1/10秒。
第四步: 將照片轉換成3d模型
這是些不同的將照片轉換成3d模型的方式,個人覺得autodesk的recap最好。
登錄 recap.autodesk.com. 如果你沒有autodesk帳號,你可以免費注冊一下,這個擁有5G硬盤,轉換3d模型足夠了。
在你登錄了recap,點擊new project,這兒你會選擇3d模型的質量(我都選最好,為什么選更低的呢?)。導出格式,很多3d打印軟件可以直接用obj文件,所以最后選這個。
在你將照片拖動到你的瀏覽器,或者點擊上傳窗口選擇你的照片上傳之后等照片上傳,點擊兩下next,然后autodesk云系統(tǒng)將會開始工作將你的照片轉換成3d模型,這將會用15~45分鐘時間,這是云端進行的所以你在等待的時候可以去做其他事情 。
當繁重的計算完成之后,你可以點擊中間的縮略圖來看你的3d模型 重要:這個要在chrome瀏覽器上完成。當你觀看你的3d模型的時候你會在左邊發(fā)現(xiàn)你圖片的縮略圖相冊,如果一切正常,你應該沒有很多(或者沒有)“Not Stitched”在列表中。這表明這些圖片中有些地方?jīng)]有檢測到,你可以試著點擊圖片上標記的點來修復。但是如我所說,3D掃描儀拍攝足夠多的照片就不會出現(xiàn)這些情況。
你可以現(xiàn)在下載obj文件到你本地電腦上去進一步處理,比如移除背景,你下載的是一個zip文件,所以你需要先解壓在跳到下一步
清理你的3d模型
有許多程序可以讓你整理你的3d模型,最簡單的程序是我在autodesk里找到的免費的“project memento” 你可以下載memento(只能用于windows)
http://labs.autodesk.com/utilities/memento
在你正確安裝project memento后,可以直接打開obj文件,應該被稱作 mesh.obj。這個2d掃描儀的照片是90度翻轉的,這意味著你可能有上下顛倒的感覺,在左邊的按鈕“did the orbiting feel off”點擊“feels off”來更正。
和你看到的那樣,不僅僅你被拍到,周圍環(huán)境也被拍到了,你可能想將那部分切除,這個在memento里面很簡單,只要用你的鼠標選擇你不想要的區(qū)域就能點擊刪除。旋轉模型,你可以很簡單的選擇并刪除你不想要的部分
修復你的3d模型
為了打印你的3d模型,你需要確定你的模型是完整的(沒有洞再上面),當然這個又能很簡單的在memento上面修改,memento窗口點擊中上你會看見一個彈出框來修復你的模型。
通過向導,任何洞都會被發(fā)現(xiàn),點擊fix。你需要選擇是smooth還是flat。我一般喜歡用flat fix,這用起來很好。再次選擇next來尋找更多的洞。洞需要被修復,其他也是可以選擇的。
在你修復所有洞值購,點擊done,現(xiàn)在你就導出了新的obj文件。你可以點擊memengo左上角點擊彎的箭頭
現(xiàn)在你可以詳細的設置你模型的保存類型。為什么要選低像素呢?。。!劃動所有模塊到右邊達到最好的質量。
你現(xiàn)在完成了所有能做的,你得到了一個可打印的模型,如果你還想修改模型,有很多軟件能幫到你。
Pixologic Sculptris (免費): 這是處理模型細節(jié)的很好的軟件,比如揉化邊緣,這有點像photoshop,但是是3d的。
Meshmixer (免費):這是從autodesk下載來的其他免費程序,他對于做平地模型很好。
其他軟件來做3d模型
除了autodesk recap,其他還有很多選擇來讓你的照片編成3d模型。
Autodesk 123d Catch (free):這個用起來像recap(通過云服務器)這個比recap更加好,但是限定了你的圖片,所以最后精度不高。
VisualSFM (free): 這是一個將你照片變成3d模型的本地軟件,你需要強大的顯卡來運行軟件。
Agisoft Photoscan Standard Edition ($179): 這個軟件同樣需要你有比較給力的電腦,但是我并沒發(fā)現(xiàn)這個軟件比recap和123d好到哪里去。
第五步: 結果
在建立了模型之后,沒有比將這個機器分享給別人更加美妙了,所以我決定參加Dutch maker faire并且給每個人提供3d攝影,我可以告訴你他很愉快的工作了6小時并掃描了225個人。你可以從我blog了解到更多www.pi3dscan.com
Step 6: 設計文件
這是我用的設計文件。statief是一個讓我用數(shù)控機來做過孔的2d cad文件
camera_mount文件是相機支架的設計文件
|
|