Movid
is the acronym for Modular Open Vision Interaction Daemon. It's a crossplatform and Open Source tracker, designed to be as modular as possible.
code download :http://github.com/tito/Movid
Movid思路分析
Movid高度模組化,主要功能模組在tito-Movid-3d5b78b/src檔案夾下面。模組moModule負責處理,模組間共用連接埠資料moDataStream。moModule體系通過moModule.h中的宏定義實現自動化綁定。
模組間連接埠資料共用通過指標淺拷貝,共用記憶體, 因為movid只是可視化opencv,輸入資料來源於camera或者video,對於二者opencv自動會管理每幀的管理,所以movid中moDataStream不需要管理連接埠資料的生命週期。
moModule體系,包括在moDataStream中使用了多線程,偶對MT還只是理解皮毛,慚愧~
moProperty中定義moModule的其他一些屬性,比如canny運算元需要的兩個int型參數,定義如下:
moCannyModule::moCannyModule() : moImageFilterModule(){<br />MODULE_INIT();<br />// declare properties<br />this->properties["lower_threshold"] = new moProperty(100);<br />this->properties["lower_threshold"]->setMin(0);<br />this->properties["lower_threshold"]->setMax(500);<br />this->properties["upper_threshold"] = new moProperty(200);<br />this->properties["upper_threshold"]->setMin(0);<br />this->properties["upper_threshold"]->setMax(500);<br />this->setInputType(0, "IplImage8");<br />this->setOutputType(0, "IplImage8");<br />}
moPipeline裡面管裡建立整個可視化情境,特別是moPipeline::parse函數,通過解析字串命令建立情境。
Movid的介面在web上實現,movid.cpp中負責網路通訊部分。
終端使用者在網頁上,以連線的方式產生了一個情境圖,從而產生一個模組間的調用序列,將這些字串傳給伺服器,伺服器端Movid解析產生結果,傳給用戶端,顯示最終結果圖片。所以這個角度說,Movid並不是所見即所得 (WYSIWYG)的編程,gui只是一種表示,跟gui層跟資料層是分離的。
Movid的執行機制有點神奇,一直沒有看到對所有模組進行拓撲排序的函數,難道通過MT就這可夠了???研究ing~
Movid示範例子,順序建立結點,按照結點ID號遍曆所有節點,調用poll / update函數。。。
demo screenshot: