回憶錄到了五之后,開始講述省創項目中的各種開發經驗。緊接剛做好百步梯項目的太陽跟蹤平臺的設計,我們放棄了回家過暑假,留在學校開始省創立項中的計劃----人眼角膜定位算法的設計。一開始,我們毫無頭緒,感覺用單片機驅動攝像頭來實現這個功能根本就是天方夜談。不過幸運的是,有個牛人師兄跟我們說,你們可以PC機作為處理平臺,在VC6下調用OPENCV的圖像處理函數對USB攝像頭拍攝回來的視頻流進行處理,就可以實現需要的功能。我們得到了指引,便開始著手摸索。 一開始是要在C++編譯平臺下配置OPENCV的庫,我記得我們當時用VS2008來配置OPENCV2.0的,跟著網友寫的教程弄,發現總是不成功,于是我們無耐地只能使用比較落后的VC6來配置,還算順利,一下就搞定了,但是OPENCV庫的版本比較舊,為了不拖慢項目研究的進度,我們只能先將就著。有了足夠的項目經費,我們3個負責圖像處理的每人都買了一本于仕琪翻譯的《學習OPENCV》開始學習OPENCV的有關圖像編程的原理及應用。 剛著手的時候,為了快速入門和掌握,我們跟著例程走,其實郭天祥教的某些學習方法在一定程度上還是有用的。我們跟著書中的例程,將一些對圖片基本操作的函數的使用方法都掌握了,比如:打開圖片、打開并顯示視頻流、二值化、動態二值化、高斯模糊、邊緣檢測、輪廓提取、霍夫變換、膨脹、腐蝕、漫水填充等等各種對圖片的處理。另外,我們為了讓寫出的軟件能夠辨別特定的物體,例如人的眼睛,于是我們也學習了如何建立分類器和使用分類器,分類器在計算機上的表現形式為以.XML為擴展名的數據庫文件,OPENCV為我們這些菜鳥提供了方便的分類器合成引擎。我們剛學習這方面知識的時候,使用的是于仕琪老師在網上公布的人臉分類器,因為書中有例程,我們很快地就掌握了使用方法。按照于老師所教的,我們想自己訓練一個我們項目專用的人眼分類器,但是于老師說,一般的分類器都需要上千張正例圖片和2倍數量的反例圖片,而且數據庫越龐大,越容易導致攝像頭視頻流的實時性下降。不管怎么說,我們還是嘗試了用幾百張的圖片來生成這樣的分類器,但是在生成的過程中,電腦頻頻死機,有點無語!最后嘗試還是夭折了,摸索的道路上,打擊和挫折總是少不了,我們早就習以為常,遇到坎直線走不過去,那我們繞個彎一樣可以走!我們最后選用了一個外國學者他自己生成的一個人眼分類器,開始了對人眼部分的圖像處理。 我們寫好了程序,對攝像頭拍回來的我們自己的實時圖像視頻流中的每一張圖片進行循環處理,其實就是用分類器作為模板去跟每一張圖片進行配對,很順利地,我們成功地把人眼部分的圖片區域截取出來,錯誤率接近于0。但是,新的難題出現了,我們發現通過模板配對出來的圖像區域的起始坐標在每一張圖片中都是不一樣的,導致我們看到人眼總是在變動(實際上我們并沒有動我們的眼睛),這樣的問題是致命的,因為我們最后的目標是利用人眼去控制鼠標,這樣的情況根本無法準確控制,我們又一次遇到了坎,在那一個星期里,我們想不出一個好用的解決方案,感覺大家的斗志有點消沉,而且注意力也從項目轉到了玩游戲、看電影,其實這是人逃避現實的表現,很正常,我們也是人,也有不如意的時候。 日子一天一天地過著,快到開學了,怎么辦?突然,一個詞出現在我們的腦海,是“濾波”。真是眾里尋他千百度,那方法卻在,燈火闌珊處。我們很快地針對當時的現象想出了一套濾波方案:在每一張圖片與人眼分類器比較之后,得到一個區域的起始坐標,我們通過對兩張圖片之間所得到的起始坐標利用勾股定理計算距離,然后對這個距離進行限幅濾波(具體的還是保密吧,畢竟涉及到我們的知識產權),我們發現可以有效地將之前的圖片抖動消除。接下來,我們沒有停止,立刻對捕捉和分離出來的穩定圖像進行canny算子的邊緣檢測、腐蝕、膨脹、輪廓提取以及霍夫圓變換等等一系列的操作,最后,我們成功地將攝像頭拍回來的視頻流中的人眼角膜準確地實現捕捉和定位,實現了我們最初的計劃內容。 開學后,我們為了保護我們這一個月以來努力的成果,按照有關的規定,寫好了專利申請書向國家專利局提交,幾個月后我們成功地獲得了專利的受理權,于是人眼定位的研究便告一段落。謝謝大家的關注,回憶錄六將會講述我們團隊整個技術路線的變革!
|