mapleboard on the table

我是楓葉板社群部落格板主Jonas~歡迎大家多發文、多回應,有任何問題歡迎寫信給我Jonas。                                               目前部落格網站有2個更動:1.草稿位置更改為博主首頁之內2.增加Emoji按鈕(按鈕的最左上角)。請大家留意並多加利用~    

無題

Michelle  2018-08-22   留言:0

1

好久沒登陸楓葉板,一時竟然想不起用戶名和密碼了,來來回回試了好多遍,雖然最後還是成功了,但心裡不免感到有些慚愧,因為我想到,做任何事情都應該要一以貫之,不可以高興就做,不高興就丟掉,像個小孩子一樣,這樣下去恐怕連信用值也要跌成負數了。

被我任性地丟掉的何止是楓葉板社群而已,還有寫作。人總是很容易給自己找到懶惰的藉口,尤其是以老子的“無為”作為人生信條的人。八月快要進入最後一周了,這也是夏天的尾巴,台北的天空,總是在晴時耀眼,天邊的雲白得像是把天堂所有的純度都吸收了進去。

4

可是每當午後它就開始在某處堆積起烏雲,甚至呈現出“東邊日出西邊雨”的態勢(下一句自己接),我從捷運文湖線某站下來時,穿過站內的空橋,無意中抬眼,看到捷運剛好從腳下呼嘯而過,而遠處的天空,是難以描述的晴雨交加,台北的天空,像是記憶裡依然年輕的面容。

答應要在故宮寫的六百字,終究在擁擠的人群中被遺忘了。它永遠人來人往,永無寧日,也許除了那些我們無緣得見的夜晚與清晨,才是無人打擾的靜美瞬間吧。

5

盤腿坐在藍色操場旁邊的看台上,風終於變得清涼,此時抬眼望見的是比操場淺了好幾度的天空,陽光在成為夕照之前,依然明晃晃地,在綠油油的草地上灑下一片片的陰影,這讓我留戀的風景,每一日都在變幻著從不雷同的光影。

耳邊傳來鳳飛飛的“好好愛我”的動人旋律,人生莫不如此,就算再無可奈何,再留戀難捨,該離開的時候還是要離開,每次當我剛剛抵達與即將告別時,我仿佛分身為兩個截然不同的自己。一個在幸福的巔峰,一個在憂傷的谷底。她們誰也不羨慕誰,誰也安慰不了誰。

2

黃昏到來前的醉月湖畔,哈瓦那咖啡館已經換了招牌,黑天鵝還是那隻很會凹造型的黑天鵝,她站在岸邊垂首兀自啄著羽翼,同時發出如同撒嬌般的低吟聲。我蹲下來拍她,並不曾使她分心,她還是她,我還是我,於是我對著她唱了一首歌。

3

我離開校園,走去馬路對面的羅斯福路小巷,拍下黃昏時的街景,然後一直沿著我熟悉的巷子走到了曾經住過的泰順街,以及附近的師大路。過往的瞬間在躍入眼簾的熟悉景物中次第重現,恍如昨日般清晰。

我在雲和街與泰順街交叉的路口處那家古早味的豆花店揮汗如雨地吃豆花,那時也是夏天。某一個月圓之夜(大概是中秋?)我站在巷子裡拍頭頂的圓月,被某種神秘的氛圍魅惑住,呆立了良久。被月光裹覆的身體仿佛被施了咒語般無法行動。

7

我就這樣帶著滿滿的感動的情緒,一路張望一路回憶著,又走回了公館我住的地方。抬頭望去,天邊的月亮已經在朝著圓滿行去。而我清楚地記得,才不過幾日之前,它剛好還是不偏不倚的半輪。它的改變,是在不知不覺中發生的,就像到來與離開,都是同樣自然。

想到這裡似乎也有些釋然了。如果這是一個輪迴,不如安然地接受。假如你為相聚而感到欣喜,就該接受短暫的別離。古人誠不欺我:“月有陰晴圓缺,人有悲歡離合,此事古難全”,好在我們還能“但願人長久,千里共嬋娟。”

快不快樂,唯心而已。不如放下執念,順其自然。

6




聽到將與老闆、同事一同參加DebConf18的時候,

大概是一種既期待又不知道該不該期待的心情吧。

期待的是在剛入行就能見到世界頂尖的開發者、貢獻者們,實在是非常難得又幸運,

但不敢期待的原因也是一樣,畢竟是Debian的「開發者年會」,

身為一個菜鳥最高級,連使用者都還不太稱的上,怎麼想都覺得我應該什麼都聽不懂吧嗚嗚。

NCTU campus

(很幸運颱風沒有來攪局,整週都風和日麗)

 

實際參與後狀況其實相去不遠,

一堂堂演講,世界各地的開發者們分享著自己最近做的東西,

台下除了認真聆聽外,更會時不時發言直接與台上互動。

我坐在講堂舒適的座椅上,搖頭晃腦地觀察著這一切,

不同口音的英文,有些能漸漸聽懂有些不能,

而聽的懂那些才讓我發現,聽的懂每一個字,卻還是不瞭解一整句話的意思。

During lecture

(這個可愛的咖啡杯也是紀念品之一)

 

日子一天天地過去,在教室中的狀況都類似如此,

但也慢慢發現,教室外的世界更是讓我驚喜連連。

星期一晚上的Cheese and Wine Party,對我來說算是一個開頭,

鐵蛋、榴槤、鳳梨酥等台灣特色小吃,與數不盡的紅酒、威士忌、自釀酒一同陳列,

旁邊是吃不完的炸地瓜、炸雞塊與火龍果、西瓜、芭樂,以及飲料與調酒區,場面甚是壯觀。

嘗遍歐洲各地的起司後,心中一個聲音告訴我,不能只顧著吃,這麼難得的場合,應該好好跟外國人交流才對。

徘徊遊走、經歷了各種內心小劇場的我,終於在一位俄羅斯人主動向我打招呼後,成功開口說了英文,聊一聊自己以前學什麼、怎麼會參加DebConf等等,

而我也受這個正面經驗所鼓勵,而繼續聊到了第二、第三個人…

很感謝友善的各位,讓這個晚上留下的記憶不只侷限於美食。

day trip - 17K biking destination  delicious dish in conference dinner

(左:Day trip的腳踏車之旅。右:Conference dinner的佳餚。)


踏出了一點舒適圈後,接下來幾天在課堂間、小旅行日、戶外BBQ晚餐、Conference dinner等場合,

我都能更自在地與人交談,也慢慢找到自己在這個年會上想做的事。

既然上課聽講對我來說學不太到東西,那我就好好融入、感受這個氣氛,

看看他們在臺上眼神發光的樣子,並開心參與各個大小行程,

同時,身為主辦國的一份子,我也想試著讓大家在臺灣有更好的體驗。

與外國人聊天時,會問問年會結束後的安排,就可以幫忙介紹一些景點,或是講解一些交通方式;

一起吃飯時,可以聊聊各地食物的差別,或是幫忙向餐廳拿到叉子湯匙。

也因為有這個想法,讓我有觀察到一些可以讓活動更好的小地方,

例如,Noisy Hacklab裡可以放置掃把畚箕,啤酒區的杯子可以多準備一些,

各個教室的位置可以有更多指示,Cheese and Wine Party的燈光希望更亮一點,戶外BBQ時希望有可回收垃圾區,

並希望有個每日問卷表單,蒐集大家對課堂、活動的回饋及建議,

或是小旅行可能要多確認各路線的安排狀況,不然一個負責人要張羅所有事情很困難,像腳踏車團出發後大家會分散,可能就需要一個群組聊天室等等。

當然這些都只是個人的意見供參考,甚至有點雞蛋裡挑骨頭的感覺,並沒有影響整個年會的成功,希望大家不要誤會。

最後我想謝謝辛苦的籌備人員們,

不管是爭取主辦權、籌措經費、事前的安排與聯絡、臨場狀況處理、事後的整理等等,背後的辛苦是我們很難體會的,

但正是因為有你們熱情的付出,才讓我們見識到了更大的世界,也讓世界各地的開發者們一同度過了一個精彩難忘的夏天。

 




DebConf18,Let's Party!

Sia  2018-08-20   留言:0

Cow_Classmate

Day1-「小牛同學救救我!!!」

對的,第1天的我就是如此的沒用,三不五時就露出水汪汪落難犬眼神。

好在第一堂課我旁邊坐了位有「Super Cow Powers」的小牛同學~~~

事到如今,我早已忘了那堂課上些什麼內容了(應該是從沒記得過吧blush

只隱約記得我大概騷擾小牛同學1/3堂課吧!

 

Day2-「Cheese and Wine Party~」

世上的共通語言是酒精吧!(肯定)(還好媽媽永遠看不到這篇文章)

我是不愛葡萄酒的,不算高的酒精濃度,總是臉紅的快,又少了些烈酒辣口的愉快感,

因此Cheese and Wine Party首要瞄準各國的獨特起司。

在故土的優勢就是左拐右轉就能看見家鄉物,操著口破英文雞雞哇哇的介紹起台灣的特色美食,

用「鳳梨酥」交到了3個朋友、「大溪豆乾」換來了2次談話,

不算當地的「榴槤」讓我跟6-7個陌生人又是皺鼻又是大笑(超好吃,不得不讚美它yes

 

世上的共通語言肯定是酒精(握拳)

在結束不知道第幾輪的「Hi~Bye~」後,有個啊抖仔拿罐透明玻璃酒瓶跟我說這GIN超好喝,

秉著神農精神,立馬也替自己斟杯。

我的天啊,超好喝!!!!!盈鼻的香料味再配上入喉的辣口爽度,啊啊啊啊啊~~~

好東西要跟好朋友分享,大家都是好朋友!

拎著酒瓶跟前來覓酒的酒友大力推薦,倒也趁機換到好幾款酒的心得(感謝大家讓我不必一一踩雷)

 

一場Party打到第3段,卻還未提及最初的主角,呃.....Cheese都很好吃,我喜歡法國的多一點。

會後,認識了個台灣女孩,她也是促成隔天小Party的契機(她老師給了10杯免費啤酒,怎捨得不開趴呢?!)

 

Day3-「Cookie and Beer Party~」

Cookie_Beer

「沒活動就自己創造活動吧!」

身為一枚資深水瓶座是無法接受預期性無聊的,明知無聊就在那,我一定要試圖改變它啊!(舉臂吶喊)

但其實一開始我也沒預計要辦這麼大(掩面)

起初隨口邀了幾個前幾天認識的外國女孩,再隨意問些外國男兒,像是雪球一樣愈滾愈大,

再加上幾個舊識、新識的台灣人,轟隆隆的滾成一大球。

有幸被德國老師Andreas Tille 開口邀約前往他的分享會,帶上所有人一同前往,不算大的會議室倏瞬擠滿黑壓壓人頭,

幾乎整間都是等會「Cookie and Beer Party~」的與會者......

我親愛的德國老師啊~你要相信我不是故意把你的場子變成我的場子的。

(德國老師分享會後也來參與了片刻的小趴踢,還分送我們「金蘋果」,哦哦哦奇妙的口感)

 

覬覦了兩天的Beer Bar,我也好想要當Bartender哦哦哦哦

微笑、介紹、俐落倒酒,除了「帥」再也找不到形容詞可以形容這整件事了

但是,登記當Bartender好麻煩噢frown

近水樓台先得月哈哈哈

趁著舉辦Cookie and Beer Party的地利之便,我扭到Bar前說我也想當Bartender

大溪地的David Prévot人超好的,他教會我壓吧桿裝啤酒的技巧,

就算我壓出的第1杯啤酒泡泡比預期多了一倍,我還是獲得了滿滿的讚美

(是的,我是個仰賴讚美生存的孩子。所以請不要吝於給我任何的讚美,任何唷~)

因此我像個嗜甜的孩子,在離開DebConf18前,我每天都去當Bartender

欣然地接受顧客跟我的Bartender Mentor給予的讚美heart

 

***後記***

其實也算不上什麼後記,不過就是打完第3天後這篇文章就無限期擱著

再一次想起他的時候,就是一個月後的現在了XDDDD

日子過得太久,重啟也顯得矯情,不如作罷

(對啦!我就是要半途而廢、始亂終棄(挖鼻))




DebConf18 group photo

對Linux相關開發愈來愈深入的你,一定會碰到現今最熱門的始祖級distribution:Debian

今年非常難得地DebConf第一次在亞洲舉行,而且就在臺灣的新竹!

今天就來分享一下其中一堂lecture的內容吧~
講者是Thomas Goirand,2010起成為Debian Developer。

我們常常聽到Google Cloud、AWS,不過這些都是由特定公司建立好的Iaas,很可惜的並不是開源。
那如果我們想要建立自己的Iaas以及雲端服務,同時又想擁抱開源與自由該怎麼辦呢?

沒關係,我們有OpenStack!

OpenStack是一套開源的雲端軟體,是一種IaaS可以讓人建立雲端服務,
由Rackspace Hosting和NASA合作開發,聽起來是不是很厲害呢!

關於IaaS與OpenStack更詳細的內容請自行google吧!

首先我們得先提及FSF的人非常反對雲端服務,因為我們的資料總是被其他商業公司所掌控,
所謂儲存在雲端就是儲存在他人的伺服器而已,而且由於這些服務都不是開源軟體,
所以他們會搞什麼鬼我們都不知道的。

不過這堂課的講者認為FSF根本搞錯對象了,該反對的不是雲端,而是這些不自由的雲端服務!
且cloud這個詞可不代表著我們的資料會放在別人的機器上,不能因為討厭SaaS就反雲端啊!
甚至每個會使用Server的人都是潛在的雲端使用者。
看到Debian cloud team跟Gnu大老槓上的郵件紀錄真的很有趣呢!

說到雲端的自由問題,講者認為SaaS是惡魔啊!
絕對不要輕易使用SaaS來進行商業活動與透露個人的資料,
不過我們還是需要Web Service啦,像是遊戲、維基、購物、訂票......

再來從IaaS建立雲端有什麼好處呢?

最吸引人的是可以成本控制,隨著專案的規模隨時可以調整雲端的規模,也可以讓他自動化,
簡單舉例,我們網站目前有多大流量就可以設定多大Storage、CPU、頻寬。
更重要的IaaS是唯一可以在線調整規模的模式喔!
也就是說我們不需要因為需求的變化,就要重開一個新雲端呢!

好啦!今天先到這裡,
剩下包括對OpenStack的一些質疑與講者的回應還有deployment範例,我們就留待下次分享吧!




Debian 使用者的 Debconf 之旅

tony  2018-08-06   留言:0

        接觸Debian 不過一個多月的時間就要參加Debian 開發者年會,我的心中的不安其實蠻重的,因為我連一個熟練的使用者都還稱不上。說好聽一點就是去增廣見聞交交朋友,說難聽一點就是去打醬油。一開始是抱持這種抗拒的心態去參與DebConf,可是在經過六天的洗禮後,我的想法改變了不少,雖然最後離開時還是有點逃離的解脫感。在實際來到交大後,我發現有一群的與會者要麼不會程式,不然也只是Debian 的使用者而已。想對Debain做出貢獻,不一定要有程式背景----做做翻譯,協助宣傳,活動出力等等都可以,頓時釋懷不少。

        好啦,抱怨到這裡,我也該進入正題,聊聊這幾天實際的活動。平常時間在幾個講廳都會安排各種主題的演講,有興趣的可以自行參加。至於不想要去聽的人可以選擇到noisy hack lab或者是quiet hack lab寫程式,休息或者打屁喝酒聊天。

 bar

        我雖然去聽了很多堂課,但絕大部分都有聽沒有懂,不是因為語言的不通,都是概念性的東西比如cross compiler,cflag等等,不知道他們到底是什麼鬼東西。所以我再下面分享一下我比較聽得懂且有興趣的東西。

FAI

起初看到主題提到cloud image,一直誤以為這次的內容和雲端存取有什麼樣的關聯,之後才知道這個project是為了debain的初學者或者是懶人能快速設定並安裝debian os 所設計。

如下圖所示

fai

透過他們提供的網路介面,只要透過勾勾選選與填資料就可以對OS做出初步設定,然後下載iso檔直接安裝,寄省時又省力。




Neo4j 圖資料庫

mark  2018-08-06   留言:0

這次來跟大家介紹一個在Debconf18 演講中學到的資料庫 Graph Database : Neo4j

影片連結

https://www.youtube.com/watch?v=QR4T7xSXrcE&t=8s

這邊他提出了package dependency information 資料很多但很稀疏

使用傳統relational database 不大合適

所以提出使用graph database 來管理的一場演講分享

 

1. 這是一個怎樣的資料庫呢?

簡單來說就是把資料與資料之間關係 以 點(資料)邊(關係)特性(點的詳細資料)紀錄

然後所以資料與資料的關係就會形成一個圖

而在資料查詢的時候只要有點的資料就可以輕鬆查到與這個資料有關係的相關資料

那這樣的資料庫會有哪些好處呢?

根據neo4j官方的說法有以下好處:

1. 可透過圖論分析方法分析資料

2. 圖像視覺化現有資料

會有這個graph database 的原因是:

主要是因為查資料的過程,資料常分散於不同table那勢必要透過join,而join 處理時間相當長,另外維持資料一致性的代價相當高,最後是schema在傳統的database一旦更動,調整代價相當龐大。

 

詳細比較graph database and relational database在這篇文章有畫圖,大家可以看看

https://read01.com/zh-tw/dOBGmO.html#.W2fpQHVuZE4

 

2.好了 那來開始安裝吧

官網︰https://neo4j.com/developer/get-started/

在這一頁有提到 如果不想安裝可以選擇 start a sandbox online

否則就點選 install neo4j 連結 填完基本資料 進入下載頁面

下載好安裝檔後依照建議,將剛剛下載的appimage透過右鍵,屬性,勾選可執行

appimage 介紹 https://zh.wikipedia.org/zh-tw/AppImage

點兩下就可以執行,之後要執行neo4j desktop 可以在Activities 找到,就不用再點選剛剛下載的appimage

neo4j in activities

 

3.安裝好了 然後 看看有哪些功能吧!

一開始運行會要求使用者輸入使用者資訊,這邊小編使用現有的gmail帳號註冊

註冊完後應該會看到類似畫面

Neo4j desktop

首先第一步就是My Project  找到 + New Graph 你就可以建立database

之後按Start 就可以開始了

然後我們到Neo4j Browser 開始玩 graph database 以及 嘗試 cypher 語法

neo4j browser portal

畫面上方可以輸入cypher語法 並可以互動方式看cypher query 視覺化之後的結果

 

4.還是很抽象 有沒有實際例子呢?

一起點下Learn about Neo4j的start learning吧

introduction

在這一部份你會學到和neo4j有關的基本介紹,留給大家自行閱讀

看完之後可以在想關掉的小區塊 右上角的叉叉關掉 

如果想實際操作可以看到畫面最上方有一個地方(console)可以輸入指令
這邊你就可以嘗試cypher 語法來query database, 輸入後按下右側三個按鈕 (星號 /  叉叉 / 三角 )的 三角 來執行

neo4j console

什麼?沒有資料嗎?那就來使用我們期待已久的範例: movie graph

console 輸入 :play movie-graph 就可以看到這一頁

movie graph tutorial

而實用上和原始的資料庫操作一樣

1. 建資料

2. 設條件找資料

那現在來看看怎麼建資料

movie tutorial create graph

程式碼好長~要一行行打嗎?

有注意到第一行的create 前面有一個play的符號? 點下去他就會把這邊的內容 copy到console去了

是不是很方便呢?

create console

最後再來看看程式碼重點順序︰

1. 建立點(電影)以及點內的屬性(片名,上映年,副標)

2. 建立點(人)以及點內的屬性(人名,出生年)

3. 建立關係 ((人)-[在電影中飾演角色[角色名稱]]->(電影))

4. 建立關係 ((人)-[導演]->(電影))

5. 其他節點 與 其他關係建立...

最後可以畫出結果是因為有執行cypher query指令

query after graph created

大意是將有Tom Hanks(a) 演出的電影 並把 電影資訊(m) 導演資訊(d) 名稱一併畫在圖上 並只回報10筆

結果如下

Graph view

movie graph

我們就可以看到以Tom Hanks為圓心 根據上面剛剛搜索要求的導演資訊 電影資訊 把相關內容 連接在一起。

左上角的 紅 藍 綠 小方塊 可以點選 調整 不同節點顯示設定 顏色  / 大小 / 顯示內容 等

左邊一排還可以看不同的結果呈現方式

Table view

將符合條件的結果依照Tom Hanks(a) 演出的電影資訊(m) 導演資訊(d) 依序擺好

movie graph table mode

Text view

把剛剛的table view 換成 text view

movie graph text mode

Code view

這邊如果一開始看太亂 可以點選 像是 Summary 旁的小三角,他會幫你調整內容縮排

movie graph code mode expanded

 

那要怎麼找資料呢?

這邊有簡單示範如何使用cypher 的 match 來完成搜索,後面還有其他範例就留給大家有興趣搜索

neo4j find

neo4j query

最後如果對資料匯入有興趣可以看看northwind 的示範內容

 

其他cypher語法參考連結

https://www.jianshu.com/p/310346976d98

https://blog.csdn.net/qq_34435926/article/details/79934850

 

下次有機會再來跟大家分享如何使用透過spark 使用neo4j

 




 

General-Purpose input/output(gpio)

(他是什麼)簡介:楓葉板是一個強大的單板電腦採用ARM Cortex-A7 高效能處理器更有著許多得擴充槽,支援相機頭,感測,

音效,通訊,控制等多樣化的擴充,提供使用者不論是學生,研究者或者是有志投入相關領域的人開發與測試嵌入式系統的世界。

本次教學涵蓋的內容在利用楓葉板控制Led燈開關與閃爍組合的行為。

1.你會需要:1)楓葉板一片 2)萬用板一片 3)不同顏色發光二極體(Led燈)*4 4)電阻*4 5)小電線*4 6)焊槍與錫條


以上材料皆可於購買楓葉板的網站統一採購。若要自行採購,請注意一下購買電阻的規格(220 Ohm)

    (小知識: 一般 I/O pin 輸出3v的電壓, 而一般Led的順向電壓為2v左右,順向電流5為mA左右,因此要串連一顆(3-2)/0.005=200以上的電阻)

     

    2.GPIO 針腳介紹:

    我們一共有四十隻針腳。為了最有效率的運用每個針腳我們設計每一隻針腳會有不同的功能。而下圖針腳編號(Pin#)旁有有顏色的框框就是我們預設這隻針腳的功能。因此既然我們的主題為GPIO因此我們會用到的部份只有預 設功能是GPIO的針腳。這邊就是編號為11,13,24,26,28,30,32,34的針腳。

    萬用板

     

     

    (如何用)硬體配置:

    這次的示範我選擇使用編號為24,26,28,30的針腳

    依照圖示將LED,電阻與電線焊好後,將背面右上40pin的排針與楓葉板右上方40pin孔的排母結合就完成硬體的配置

     

     

    正面
    正面
    反面
    反面

     

     

    楓葉板
    楓葉板
    完成
    結合圖

     

     

    led

    (範例簡介)python範例:

    以下例子為讓所有LED一起亮一起暗(如果要停止程序請按鍵盤上的任意鍵)

    1.首先我要讓程式知道這是一個python script,在開頭要加上

    #!/usr/bin/python

     

    2.我們要取得那四支pin腳的控制,並設定它們輸出訊號,因此先來了解一下要從哪裡控制,而它們的編號又是什麼。

      以24號pin腳為例:

      首先我們看到 24號pin腳它GPIO那欄的編號有一個數字6(詳細算法請看頁尾*****)那就是我們到時候要選擇這支pin腳時它的編號

      我們在 /sys/class/gpio/ 路徑下的export服務輸入要選用的pin腳編號6,系統就會那隻腳被啟用了

      然後在 /sys/class/gpio6/direction 中輸入 out,就設定完輸出訊號了

     

    自定義函式

    #exports the pin that we choose to use  
    def export_pins(pins):
        try:
            f = open("/sys/class/gpio/export","w")
            f.write(str(pins), )
            f.close()
        except IOError:
            print "GPIO %s already Exists, so skipping export gpio" % (str(pins), )
    #set the direction of selected pin
    def setpindirection(pin_no, pin_direction):
        gpiopin = "gpio%s" % (str(pin_no), )
        pin = open("/sys/class/gpio/"+gpiopin+"/direction","w")
        pin.write(pin_direction)
        pin.close()
    

    主程式中

    export_pins(6)
    setpindirection(6, "out")

    (告訴系統我們要控制24號pin腳並將它設為訊號輸出)

     

    3.至於如何使LED暗與亮,我們亦以 24號pin腳的LED為例

      在 /sys/class/gpio6/value 中輸入 1就會亮 0就熄滅

    自定義函式

    def writepins(pin_no, pin_value):
        gpiopin = "gpio%s" % (str(pin_no), )
        pin = open("/sys/class/gpio/"+gpiopin+"/value","w")
        if pin_value == "led_on":
          pin.write("1")
        else:
          pin.write("0")
        pin.close()

    主程式中

    writepins(gpio_pa6, "led_on")

    writepins(gpio_pa6, "led_off")

    我們可以透過編輯不同的LED燈開與關的組合達到自己想要的閃爍模式

     

    4.最後最重要的一點是我們在結束這個程序後要,要告訴系統我們已經使用完這支pin腳,要將使用權還回去

    自定義函式

    def unexport_pins(pins):
        try:
            f = open("/sys/class/gpio/unexport","w")
            f.write(str(pins), )
            f.close()
        except IOError:
            print "GPIO %s doesn't  Exists, so skipping unexport gpio" % (str(pins), )
    

    主程式中

    unexport_pins(6)

    完整程式碼:

    #!/usr/bin/python
    # coding=utf8
    ########################################################################################
    #
    # GPIO LED Demo program 
    # Copyright (C) Tony Chen <tony@ces.com.tw>
    # MapleBoard.org
    # 
    # This program is free software; you can redistribute it and/or modify
    # it under the terms of the GNU General Public License version 2 as
    # published by the Free Software Foundation.
    #
    ########################################################################################
    
    import random 
    gpio_pa6 = 6
    gpio_pa7 = 7
    gpio_pa8 = 8
    gpio_pa9 = 9
    
    #exports the pin that we choose to use  
    def export_pins(pins):
        try:
            f = open("/sys/class/gpio/export","w")
            f.write(str(pins), )
            f.close()
        except IOError:
            print "GPIO %s already Exists, so skipping export gpio" % (str(pins), )
    #unexports the pin that we choose to use  
    def unexport_pins(pins):
        try:
            f = open("/sys/class/gpio/unexport","w")
            f.write(str(pins), )
            f.close()
        except IOError:
            print "GPIO %s doesn't  Exists, so skipping unexport gpio" % (str(pins), )
    #set the direction of selected pin
    def setpindirection(pin_no, pin_direction):
        gpiopin = "gpio%s" % (str(pin_no), )
        pin = open("/sys/class/gpio/"+gpiopin+"/direction","w")
        pin.write(pin_direction)
        pin.close()
    #turn on or off the LED of selected pin
    def writepins(pin_no, pin_value):
        gpiopin = "gpio%s" % (str(pin_no), )
        pin = open("/sys/class/gpio/"+gpiopin+"/value","w")
        if pin_value == "led_on":
          pin.write("1")
        else:
          pin.write("0")
        pin.close()
    #random choose LED
    def random_LED():
        randnumber = random.randint(1,4)
        return transfer(randnumber)
    #random choose on or off
    def random_onoff():
        randnumber = random.randint(5,6)
        return transfer(randnumber)
    def transfer(number_chosen):
        pick={
          1: "6",
          2: "7",
          3: "8",
          4: "9",
          5: "led_on",
          6: "led_off"        
        }
        return pick.get(number_chosen)
    #home
    if __name__ == '__main__':
        from time import sleep
        unexport_pins(gpio_pa6)
        unexport_pins(gpio_pa7)
        unexport_pins(gpio_pa8)
        unexport_pins(gpio_pa9)
    
        export_pins(gpio_pa6)
        export_pins(gpio_pa7)
        export_pins(gpio_pa8)
        export_pins(gpio_pa9)
    
        setpindirection(gpio_pa6, "out")
        setpindirection(gpio_pa7, "out")
        setpindirection(gpio_pa8, "out")    
        setpindirection(gpio_pa9, "out")
    
        print "press crtl+c to exit"
    
        while(1):
            counter=0
            #random1
            while(counter<8):
                a=random_LED()
                writepins(a, "led_on")
                sleep(0.5)
                writepins(a, "led_off")
                sleep(0.5)
                counter=counter+1	
            #random2
            while(counter<16):
                a=random_LED()
                b=random_onoff()
                writepins(a, b)
                sleep(0.5)
                counter=counter+1
            #sequential
            while(counter<24):
                writepins(gpio_pa6, "led_on")
                sleep(0.5)
                writepins(gpio_pa6, "led_off")
                sleep(0.5)
                writepins(gpio_pa7, "led_on")
                sleep(0.5)
                writepins(gpio_pa7, "led_off")
                sleep(0.5)
                writepins(gpio_pa8, "led_on")
                sleep(0.5)
                writepins(gpio_pa8, "led_off")
                sleep(0.5)
                writepins(gpio_pa9, "led_on")
                sleep(0.5)
                writepins(gpio_pa9, "led_off")
                sleep(0.5)
                counter=counter+1
            #two_by_two
            while(counter<32):
                writepins(gpio_pa6, "led_on")
                writepins(gpio_pa7, "led_on")
                sleep(0.5)
                writepins(gpio_pa6, "led_off")
                writepins(gpio_pa7, "led_off")
                sleep(0.5)
                writepins(gpio_pa8, "led_on")
                writepins(gpio_pa9, "led_on")
                sleep(0.5)
                writepins(gpio_pa8, "led_off")
                writepins(gpio_pa9, "led_off")
                sleep(0.5)
                counter=counter+1
            #all
            while(counter<40):
                writepins(gpio_pa6, "led_on")
                writepins(gpio_pa7, "led_on")
                writepins(gpio_pa8, "led_on")
                writepins(gpio_pa9, "led_on")
                sleep(0.5)
                writepins(gpio_pa6, "led_off")
                writepins(gpio_pa7, "led_off")
                writepins(gpio_pa8, "led_off")
                writepins(gpio_pa9, "led_off")
                sleep(0.5)
                counter=counter+1
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    

    請直接將程式碼複製下來存在製作一個demo.py檔案

    將demo.py丟到 楓葉板的目錄中:

    開啟terminal 連到楓葉板

    $ssh mpl1@your_mapleboards_ID

     

    執行demo.py

    $sudo python /home/mpl1/demo.py

     

    個別範例

    隨機1

    #!/usr/bin/python
    # coding=utf8
    
    import random 
    gpio_pa6 = 6
    gpio_pa7 = 7
    gpio_pa8 = 8
    gpio_pa9 = 9
    
    #exports the pin that we choose to use  
    def export_pins(pins):
        try:
            f = open("/sys/class/gpio/export","w")
            f.write(str(pins), )
            f.close()
        except IOError:
            print "GPIO %s already Exists, so skipping export gpio" % (str(pins), )
    #unexports the pin that we choose to use  
    def unexport_pins(pins):
        try:
            f = open("/sys/class/gpio/unexport","w")
            f.write(str(pins), )
            f.close()
        except IOError:
            print "GPIO %s doesn't  Exists, so skipping unexport gpio" % (str(pins), )
    #set the direction of selected pin
    def setpindirection(pin_no, pin_direction):
        gpiopin = "gpio%s" % (str(pin_no), )
        pin = open("/sys/class/gpio/"+gpiopin+"/direction","w")
        pin.write(pin_direction)
        pin.close()
    #turn on or off the LED of selected pin
    def writepins(pin_no, pin_value):
        gpiopin = "gpio%s" % (str(pin_no), )
        pin = open("/sys/class/gpio/"+gpiopin+"/value","w")
        if pin_value == "led_on":
            pin.write("1")
        else:
            pin.write("0")
        pin.close()
    #choose random LED
    def random_LED():
        randnumber = random.randint(1,4)
        return transfer(randnumber)
    def transfer(number_chosen):
        pick={
          1: "6",
          2: "7",
          3: "8",
          4: "9"     
        }
        return pick.get(number_chosen)
    #main
    if __name__ == '__main__':
        from time import sleep
        unexport_pins(gpio_pa6)
        unexport_pins(gpio_pa7)
        unexport_pins(gpio_pa8)
        unexport_pins(gpio_pa9)
    
        export_pins(gpio_pa6)
        export_pins(gpio_pa7)
        export_pins(gpio_pa8)
        export_pins(gpio_pa9)
    
        setpindirection(gpio_pa6, "out")
        setpindirection(gpio_pa7, "out")
        setpindirection(gpio_pa8, "out")    
        setpindirection(gpio_pa9, "out")
    
        print "press crtl+c to exit"
    
        while(1):
          a=random_LED()
          writepins(a, "led_on")
          sleep(1)
          writepins(a, "led_off")
          sleep(1)

    隨機2

    #!/usr/bin/python
    # coding=utf8
    
    import random 
    gpio_pa6 = 6
    gpio_pa7 = 7
    gpio_pa8 = 8
    gpio_pa9 = 9
    
    #exports the pin that we choose to use  
    def export_pins(pins):
        try:
            f = open("/sys/class/gpio/export","w")
            f.write(str(pins), )
            f.close()
        except IOError:
            print "GPIO %s already Exists, so skipping export gpio" % (str(pins), )
    #unexports the pin that we choose to use  
    def unexport_pins(pins):
        try:
            f = open("/sys/class/gpio/unexport","w")
            f.write(str(pins), )
            f.close()
        except IOError:
            print "GPIO %s doesn't  Exists, so skipping unexport gpio" % (str(pins), )
    #set the direction of selected pin
    def setpindirection(pin_no, pin_direction):
        gpiopin = "gpio%s" % (str(pin_no), )
        pin = open("/sys/class/gpio/"+gpiopin+"/direction","w")
        pin.write(pin_direction)
        pin.close()
    #turn on or off the LED of selected pin
    def writepins(pin_no, pin_value):
        gpiopin = "gpio%s" % (str(pin_no), )
        pin = open("/sys/class/gpio/"+gpiopin+"/value","w")
        if pin_value == "led_on":
          pin.write("1")
        else:
          pin.write("0")
        pin.close()
    #random choose LED
    def random_LED():
        randnumber = random.randint(1,4)
        return transfer(randnumber)
    #random choose on or off
    def random_onoff():
        randnumber = random.randint(5,6)
        return transfer(randnumber)
    def transfer(number_chosen):
        pick={
          1: "6",
          2: "7",
          3: "8",
          4: "9",
          5: "led_on",
          6: "led_off"        
        }
        return pick.get(number_chosen)
    #main
    if __name__ == '__main__':
        from time import sleep
        unexport_pins(gpio_pa6)
        unexport_pins(gpio_pa7)
        unexport_pins(gpio_pa8)
        unexport_pins(gpio_pa9)
    
        export_pins(gpio_pa6)
        export_pins(gpio_pa7)
        export_pins(gpio_pa8)
        export_pins(gpio_pa9)
    
        setpindirection(gpio_pa6, "out")
        setpindirection(gpio_pa7, "out")
        setpindirection(gpio_pa8, "out")    
        setpindirection(gpio_pa9, "out")
    
        print "press crtl+c to exit"
    
        while(1):
          a=random_LED()
          b=random_onoff()
          writepins(a, b)
          sleep(0.5)
          

    依序

    #!/usr/bin/python
    # coding=utf8
    
    gpio_pa6 = 6
    gpio_pa7 = 7
    gpio_pa8 = 8
    gpio_pa9 = 9
    
    #exports the pin that we choose to use  
    def export_pins(pins):
        try:
            f = open("/sys/class/gpio/export","w")
            f.write(str(pins), )
            f.close()
        except IOError:
            print "GPIO %s already Exists, so skipping export gpio" % (str(pins), )
    #unexports the pin that we choose to use  
    def unexport_pins(pins):
        try:
            f = open("/sys/class/gpio/unexport","w")
            f.write(str(pins), )
            f.close()
        except IOError:
            print "GPIO %s doesn't  Exists, so skipping unexport gpio" % (str(pins), )
    #set the direction of selected pin
    def setpindirection(pin_no, pin_direction):
        gpiopin = "gpio%s" % (str(pin_no), )
        pin = open("/sys/class/gpio/"+gpiopin+"/direction","w")
        pin.write(pin_direction)
        pin.close()
    #turn on or off the LED of selected pin
    def writepins(pin_no, pin_value):
        gpiopin = "gpio%s" % (str(pin_no), )
        pin = open("/sys/class/gpio/"+gpiopin+"/value","w")
        if pin_value == "led_on":
          pin.write("1")
        else:
          pin.write("0")
        pin.close()
    #main
    if __name__ == '__main__':
        from time import sleep
        unexport_pins(gpio_pa6)
        unexport_pins(gpio_pa7)
        unexport_pins(gpio_pa8)
        unexport_pins(gpio_pa9)
        
        export_pins(gpio_pa6)
        export_pins(gpio_pa7)
        export_pins(gpio_pa8)
        export_pins(gpio_pa9)
    
        setpindirection(gpio_pa6, "out")
        setpindirection(gpio_pa7, "out")
        setpindirection(gpio_pa8, "out")    
        setpindirection(gpio_pa9, "out")
    
        print "press crtl+c to exit"
    
        while(1):
          writepins(gpio_pa6, "led_on")
          sleep(1)
          writepins(gpio_pa6, "led_off")
          sleep(1)
          writepins(gpio_pa7, "led_on")
          sleep(1)
          writepins(gpio_pa7, "led_off")
          sleep(1)
          writepins(gpio_pa8, "led_on")
          sleep(1)
          writepins(gpio_pa8, "led_off")
          sleep(1)
          writepins(gpio_pa9, "led_on")
          sleep(1)
          writepins(gpio_pa9, "led_off")
          sleep(1)

    兩個兩個

    #!/usr/bin/python
    # coding=utf8
    
    gpio_pa6 = 6
    gpio_pa7 = 7
    gpio_pa8 = 8
    gpio_pa9 = 9
    
    #exports the pin that we choose to use  
    def export_pins(pins):
        try:
            f = open("/sys/class/gpio/export","w")
            f.write(str(pins), )
            f.close()
        except IOError:
            print "GPIO %s already Exists, so skipping export gpio" % (str(pins), )
    #unexports the pin that we choose to use  
    def unexport_pins(pins):
        try:
            f = open("/sys/class/gpio/unexport","w")
            f.write(str(pins), )
            f.close()
        except IOError:
            print "GPIO %s doesn't  Exists, so skipping unexport gpio" % (str(pins), )
    #set the direction of selected pin
    def setpindirection(pin_no, pin_direction):
        gpiopin = "gpio%s" % (str(pin_no), )
        pin = open("/sys/class/gpio/"+gpiopin+"/direction","w")
        pin.write(pin_direction)
        pin.close()
    #turn on or off the LED of selected pin
    def writepins(pin_no, pin_value):
        gpiopin = "gpio%s" % (str(pin_no), )
        pin = open("/sys/class/gpio/"+gpiopin+"/value","w")
        if pin_value == "led_on":
          pin.write("1")
        else:
          pin.write("0")
        pin.close()
    #main
    if __name__ == '__main__':
        from time import sleep
        unexport_pins(gpio_pa6)
        unexport_pins(gpio_pa7)
        unexport_pins(gpio_pa8)
        unexport_pins(gpio_pa9)
        
        export_pins(gpio_pa6)
        export_pins(gpio_pa7)
        export_pins(gpio_pa8)
        export_pins(gpio_pa9)
    
        setpindirection(gpio_pa6, "out")
        setpindirection(gpio_pa7, "out")
        setpindirection(gpio_pa8, "out")    
        setpindirection(gpio_pa9, "out")
    
        print "press crtl+c to exit"
    
    
        while(1):
          writepins(gpio_pa6, "led_on")
          writepins(gpio_pa7, "led_on")
          sleep(1)
          writepins(gpio_pa6, "led_off")
          writepins(gpio_pa7, "led_off")
          sleep(1)
          writepins(gpio_pa8, "led_on")
          writepins(gpio_pa9, "led_on")
          sleep(1)
          writepins(gpio_pa8, "led_off")
          writepins(gpio_pa9, "led_off")
          sleep(1)

    全部

    #!/usr/bin/python
    # coding=utf8
    
    gpio_pa6 = 6
    gpio_pa7 = 7
    gpio_pa8 = 8
    gpio_pa9 = 9
    
    #exports the pin that we choose to use  
    def export_pins(pins):
        try:
            f = open("/sys/class/gpio/export","w")
            f.write(str(pins), )
            f.close()
        except IOError:
            print "GPIO %s already Exists, so skipping export gpio" % (str(pins), )
    #unexports the pin that we choose to use  
    def unexport_pins(pins):
        try:
            f = open("/sys/class/gpio/unexport","w")
            f.write(str(pins), )
            f.close()
        except IOError:
            print "GPIO %s doesn't  Exists, so skipping unexport gpio" % (str(pins), )
    #set the direction of selected pin
    def setpindirection(pin_no, pin_direction):
        gpiopin = "gpio%s" % (str(pin_no), )
        pin = open("/sys/class/gpio/"+gpiopin+"/direction","w")
        pin.write(pin_direction)
        pin.close()
    #turn on or off the LED of selected pin
    def writepins(pin_no, pin_value):
        gpiopin = "gpio%s" % (str(pin_no), )
        pin = open("/sys/class/gpio/"+gpiopin+"/value","w")
        if pin_value == "led_on":
          pin.write("1")
        else:
          pin.write("0")
        pin.close()
    #main
    if __name__ == '__main__':
        from time import sleep
        unexport_pins(gpio_pa6)
        unexport_pins(gpio_pa7)
        unexport_pins(gpio_pa8)
        unexport_pins(gpio_pa9)
        
        export_pins(gpio_pa6)
        export_pins(gpio_pa7)
        export_pins(gpio_pa8)
        export_pins(gpio_pa9)
    
        setpindirection(gpio_pa6, "out")
        setpindirection(gpio_pa7, "out")
        setpindirection(gpio_pa8, "out")    
        setpindirection(gpio_pa9, "out")
    
        print "press crtl+c to exit"
    
        while(1):
          writepins(gpio_pa6, "led_on")
          writepins(gpio_pa7, "led_on")
          writepins(gpio_pa8, "led_on")
          writepins(gpio_pa9, "led_on")
          sleep(1)
          writepins(gpio_pa6, "led_off")
          writepins(gpio_pa7, "led_off")
          writepins(gpio_pa8, "led_off")
          writepins(gpio_pa9, "led_off")
          sleep(1)

     

     

    ——————————————————————————————————————————————————————————————————————

     

    *****實際上它們編號的算法是數字前面的英文字(A代表1 B代表2  以此類推)-1,乘與32,最後再加上那個數字

            以24號pin腳為例(GPIO-PA6) :                                (A-1)*32+6=6;

            以34號pin腳為例(GPIO-PE15):                              (E-1)*32+15=133

     




    Arm Compute Library是什麼
    Arm Compute Library是針對影像處理、電腦視覺及機器學習的一套豐富的低階函式庫,透過Arm Cortex CPU中的NEON及符合OpenCL的Arm Mali GPU來達成優化的目的。

    Arm Compute Library在MIT授權條款下是能夠免費使用的,它包含以下這些函式:

    ●基本運算

    ●顏色操作

    ●卷積濾波器(Sobel, Gaussian, ...)

    ●邊緣檢測運算(Canny Edge、Harris corner、光流法…)

    ●卷積神經網路(CNN)的相關運算(激活層、卷積層、池化層、完全連接層…)

    ●其他,如GEMM(一般矩陣乘法)、SVM(支援向量機)、HOG(方向梯度直方圖)…

    three main purposes

     

    Arm Compute Library的特色
    近年來,行動運算及智能視覺應用的快速發展,為生活帶來了便利,卻也為開發者們帶來了新的挑戰:

    ●程式碼在不同設備上的可攜性(例如,將程式碼移植到手機或嵌入式裝置時,是否還能使用?)

    ●程式碼在不同架構下的優化(例如,是否有SIMD加速器?是32位元或是64位元的架構?)

    Arm Compute Library的誕生,很大一部份就是為了解決這兩個問題,希望讓基於Arm架構的平台,都能輕鬆實現智能視覺應用的有效運用,以減低成本與設計程式的精力。

    除此之外,Arm Compute Library的效能比起也被廣泛使用的電腦視覺函式庫OpenCV,是有顯著提升的,各種運算都更為快速。

     

    這篇文章將會利用Arm Compute Library提供的程式範例,在楓葉板上玩玩看影像處理。

    照著步驟來,我們將能輕鬆完成如下的效果:

    原始圖片:

    before (helicopter)

    (Photo on VisualHunt)

    卡通化後的圖片:

    after (helicopter) 

     

    1. 下載Arm Compute Library提供的檔案:

    進入Arm Compute Library的github網頁:https://github.com/ARM-software/ComputeLibrary

    download zip

    點選「Clone or download」,再點選「Download ZIP」。下載的同時,可以在github上觀察一下

    Arm Compute Library的架構

    有「arm_compute」、「data」、「docs」等許多資料夾,其中與這篇文章比較相關的,有三個資料夾可以多留意一下,分別是:

    ●「arm_compute」資料夾,它包含了函式庫的所有標頭檔(.h檔)

    ●「examples」資料夾,裡面有幾個可供編譯的範例程式

    ●「src」資料夾,它包含了函式庫的原始檔(.cpp檔)

     

    除此之外,Arm Compute Library的構成,主要分為兩個部份:

    ●「core」:電腦的核心(kernel)被包含在core裡面。核心不會分配記憶體空間,也不會執行多執行緒處理,只會提供工作可以怎麼被切割給不同執行緒的相關資訊。

    ●「runtime」:runtime裡則是函式。這些函式圍繞著電腦的核心,它們會為(多維)矩陣分配記憶體空間,也能利用核心提供的資訊,以多執行緒來運算。

     

     

    2. 將電腦本機與楓葉板連線:

    請先確認已經安裝好你的楓葉板(MapleBoard),並且知道你的楓葉板的IP位址。

    若尚未完成這兩件事,請先參考「MP130楓葉板快速安裝手冊」。

    $ ssh mpl1@192.168.x.xxx

    ssh指令為登入遠端主機,用法為「ssh 使用者名稱@IP位址」。

    楓葉板使用者名稱預設為mpl1。@後面請輸入你的楓葉板的IP位址。

    接著輸入yes(只有在電腦第一次連上楓葉板時才需要)

    接著輸入1234(楓葉板使用者mpl1的預設密碼)

    成功登入後,應該可以看到使用者改變了,如圖:

    mpl1@MPL83

     

     

    3. GUI介面的準備:

    打開GUI介面的家目錄,點選左側的Other Locations,並在圖中紅圈處打上「sftp://192.168.x.xxx(你的楓葉板的IP位址)」,按下Connect。

    enter server address

    接著輸入使用者名稱mpl1及密碼1234,按Connect。

    成功連接上楓葉板後,點選左側新出現的「192.168.x.xxx」,即可看到楓葉板的空白家目錄。

    後面執行各步驟時,可以藉由重新載入目錄,更清楚的看到發生了什麼事情。

    除此之外,我們在查看要處理的圖片檔及處理完畢的檔案時,都將使用到這個目錄。

     

     

    4. 安裝所需的套件:

    $ sudo apt install build-essential unzip scons

    sudo指令為使用系統管理員的身份執行後面的指令,apt install為安裝套件的指令。

    這次會使用到build-essential、unzip及scons這三個套件。

    使用sudo指令時,必須先輸入正確的密碼才能繼續,所以輸入1234

    4.1 檢查將用到的g++是否有安裝成功,及其版本為何:

    $ g++ -v

    若最後一行有出現類似下圖的資訊,

    g++ version

    即代表有安裝成功,及目前版本為何。

     

     

    5. 在楓葉板上建造出完整的Arm Compute Library函式庫:

    5.1 將下載好的檔案移至楓葉板

    使用GUI介面,將步驟1.下載好的「ComputeLibrary-master.zip」檔案剪下(在電腦的家目錄的Downloads資料夾內),並在楓葉板的家目錄貼上。

    註:此步驟亦可在終端機上操作

    $ scp username@computer_IP:/home/username/Downloads/ComputeLibrary-master.zip ~

    scp指令為將遠端資料複製到本地端(或將本地端資料複製到遠端)。~代表家目錄。

    5.2 將下載好的檔案解壓縮

    $ unzip ComputeLibrary-master.zip

    unzip為解壓縮指令。完成後,當前目錄會多出一個「ComputeLibrary-master」資料夾。

    5.3 進入ComputeLibrary-master這個資料夾

    $ cd ComputeLibrary-master

    cd為切換目錄指令。

    5.4 進行編譯,建構出完整的函式庫

    $ scons Werror=1 debug=0 asserts=0 neon=1 opencl=0 examples=1 build=native -j4

    進行編譯。這個步驟約須花費30~40分鐘,請耐心等待。

    完成後,ComputeLibrary-master資料夾內將多出一個「build」資料夾。

     


    6. 測試:

    6.1 設定變數

    $ export LD_LIBRARY_PATH=build/

    export指令為設定環境變數。將LD_LIBRARY_PATH這個變數設定為build/。

    6.2 測試是否已建好環境

    $ ./build/examples/neon_cartoon_effect

    得到如圖的結果:

    test passed

    圖中的「Test passed」代表一切正常,已經可以正確執行。

    而第三行跟我們說明了使用方法為:輸入「./build/examples/neon_cartoon_effect 圖片檔名稱.ppm」

    因此接下來我們要準備副檔名為.ppm的圖片檔。

     

     

    7. 準備欲卡通化的圖片:

    回到楓葉板家目錄的GUI介面,新增一個資料夾並命名為「Pictures」

    將欲卡通化的圖片存入這個資料夾中,請注意必須為.ppm的格式。例如我存了一張「helicopter.ppm」。  

     

     

    8. 將圖片卡通化:

    $ ./build/examples/neon_cartoon_effect ../Pictures/圖片檔名稱.ppm

    「../Pictures/圖片檔名稱.ppm」是圖片的位置,圖片位在上一層目錄(..代表上一層)之中的Pictures資料夾中。

    得到如圖的結果:

    helicopter passed

    「Test passed」代表已經正確執行完畢。

    重新載入一次Pictures資料夾,檔名為「圖片檔名稱.ppm_out.ppm」的檔案,即為卡通化後的影像。

    完成第一張圖片的卡通化後,只要重複步驟7.及8.,就可以繼續處理第二張圖片、第三張圖片…

    8.1 離開楓葉板

    $ exit

    離開mpl1的身份,回到原來的使用者及電腦。今天的玩耍就告一段落囉。

     

     

    9. 日後使用:

    因為今天已經把環境建好(套件安裝了、檔案下載了、程式編譯了…),所以再次登入楓葉板來做影像卡通化時,可以省略許多步驟。

    完成步驟3.,並將欲卡通化的(多個)圖片檔存入Pictures資料夾之後,只需要以下這些指令,即可完成:

    $ ssh mpl1@192.168.x.xxx
    $ 1234
    $ cd ComputeLibrary-master
    $ export LD_LIBRARY_PATH=build/
    $ ./build/examples/neon_cartoon_effect ../Pictures/圖片檔名稱1.ppm
    $ ./build/examples/neon_cartoon_effect ../Pictures/圖片檔名稱2.ppm
    $ ./build/examples/neon_cartoon_effect ../Pictures/圖片檔名稱3.ppm
    $ exit

     

     

    希望大家玩的愉快~

    before (donuts)   after (donuts)

    (Photo credit: ferrysitompul on Visualhunt.com / CC BY)

    before (fountain)   after (fountain)

    (Photo on VisualHunt.com)

    before (goalkeeper)   after (goalkeeper)

    (Photo on Visualhunt.com)

     

     

    參考文章:

    https://community.arm.com/graphics/b/blog/posts/cartoonifying-images-on-raspberry-pi-with-the-compute-library

    https://community.arm.com/graphics/b/blog/posts/arm-compute-library-for-computer-vision-and-machine-learning-now-publicly-available