小松鼠嚇了一跳,有了魔法眼鏡後,這世界看起來完全不一樣了

顯示具有 F# 標籤的文章。 顯示所有文章
顯示具有 F# 標籤的文章。 顯示所有文章

2013年8月5日 星期一

[COSCUP2013] Python, F#, Golang and Friends 投影片


我這次在 COSCUP 演講的投影片。


[COSCUP2013] Python, F#, Golang and Friends from weijr

當天因為時間改變,差了十分鐘,所以沒有把重點表達完整。

我主要想說的是,大多數想在 Python 做的邏輯流程,你都能直接在 F# 裡面用類似的思考流完成(Scala 也是)。
例外是 F# 中迴圈沒有 break,沒有 return,也沒有多重繼承。但習慣後就知道如何轉換。
反過來, F# 有了一些思考單元,在 Python 中則要被迫展開。
Go 則完全不同,如果你用 Python 的思考方式常常會不容易實作。通常你也不應該這樣做(雖然我之前就這樣做,但能做不表示要做,hack 本來就是要嘗試不該做的事)。
Go 的思考流跟 C 比較像,而且拿 C 的想法來寫 Go 會很輕鬆,因為可以寫得更簡潔。當然原本就是用 C 的想法寫 Python 的人就沒差(用 C++ 想法的人有差,物件導向)。


所以當你只常用一種語言的時候,思考其實是被限制住的。更可怕的是,你根本不會察覺這一點、根本不知道你失去什麼。

就像我在演講中舉的例子, 那些語言中只有絕對方位(東南西北),而沒有相對方位(前後左右)的人,有著絕佳的方位感。
一般語言習慣用相對方位的人,根本不知道自己失去了什麼。
(又如馬戲團被圈住的大象那個故事,或者語言中顏色名稱的種類)
所以不只要追求好的語言,有時甚至要刻意嘗試一些看似無用、怪異語言。
 

2011年7月13日 星期三

OpenNI + F# 3d mesh Test


修改之前的程式,將 points cloud 改成簡單的 mesh,配合 image texture。效果似乎好點。
程式碼中用到 F# powerpack 的 PSeq 和 Array.Parallel,簡單的利用平行處理加速。
執行檔和 source 下載
執行時需要 .Net 4.0
OpenNI (只要 binary 和 Hardware binary)
Sensor Kinect Driver

2011年7月12日 星期二

用 F# 和 Kinect +OpenNI 產生 Point Cloud

這和前一篇 用 F# 和 Kinect SDK 產生 Point Cloud 是幾乎一樣的程式,只不過改用 OpenNI 而不是用 Kinect SDK beta。 OpenNI 支援將色彩和深度資訊重合,所以出來的結果比之前手工亂搞的正確得多。但是似乎沒有 Kinect SDK 的 ready callback 機制,所以用 background worker 取代。
OpenNI 似乎也不支援 80x60 的解析度。

2011年7月11日 星期一

用 F# 和 Kinect SDK 產生 Point Cloud


本文附的 F# 程式碼,是用 Kinect SDK 來產生 "points cloud"。
程式的效果如影片。
過程中的一些紀錄:
  • 因為之前的 visual studio 2010 過了試用期限,所以我有一段時間沒用 F#, 稍有一點生疏,但這問題不大。問題是我沒有寫過 .net 上的 GUI 程式,更別說是 3D 繪圖了,所以花了一點時間在網路上找範例。 F# 的 GUI 參考資料似乎不是很多,很多似乎也不太靈。
  • Kinect SDK 和 driver 簡單好用,骨架判斷似乎比之前 OpenNI 容易(沒有打錯字,這不是用來判斷股價的軟體),在狹小空間(像是大多數寫程式的地方)就能辨認出骨架。
  • 根據 Wikipedia,Kinect 的 depth sensor 橫向角度 57度,垂直角度 43度。
  • 網路查詢結果,System.Media3D 似乎無法直接畫出「點」,沒辦法做出 point cloud。所以用 squares cloud 或者 cubes cloud 來代替。
  • 我的筆記型電腦 GPU 太差,最多只能跑 80x60 的 cubes cloud。所以影片中解析度很差。
  • 設法將 Video Image 和 Depth Image 組合,發現不吻合。理論上應該要用 Color in Depth Space 或者 Depth in Color Space 的參數來設定 Kinect,但是網路上查詢的結果是, Kinect SDK Beta 還不支援這些。
  • 也許應該改用 OpenNI,但是程式碼已經寫了一半了,繼續用手工的方是將色彩和深度組合。
  • 色彩和深度的圖形居然是鏡像(x軸方向相反)?應該是我哪裡搞錯了。
  • 由於沒有硬體規格,解析度太低也很難實驗,所以用觀察和嘗試錯誤法很粗糙的將色彩資訊以及深度資訊勉強組合在一起。
  • 之後改用 OpenNI 試試看。