天天看點

2004年下半年工作總結

首先,簡單的把曾經做的工作按時間順序排一下吧,既不太清,不過大緻的時間順序是這樣的。

我的導師很好,他很久以前就跟我說,讓我做雙目視覺方面的研究,不過一直沒有作,當時是因為功課太多。真正開始有關這方面的研究是從暑假開始的,從暑假開始我就參與了一個項目,在其中,和另一個女孩一起做雙目視覺方面的研究

1。2004年的暑假7、8月份,我大緻處于看一些有關雙目視覺的文章,并且考慮如何實作機器人在球場中的自定位階段。在這個階段中,我對雙目視覺有了一些了解。當時對雙目視覺的概念是首先要對錄影機進行标定,然後是兩個攝像頭之間的圖像的比對問題。并且認為,錄影機标定都有了比較成熟的算法,而圖像的比對問題是難點。這些了解都隻是從一些文章上看到的,并沒有實際去做去想。現在認為,錄影機标定确實是有成熟的方法,不過還是有不少人去從各個方面研究(包括用于标定的參照物等等),而這些隻是研究,真正的算法的架構等等,也許就是大體的原有的那些。如果要做一個項目,隻要用成熟的算法就夠了。如果是做研究,可以去研究這些,但是要深入地去研究這些錄影機标定的算法,數學的功底不好是不行的。對于圖像的比對,我當時感覺好難。因為文章中都是說沒有統一的行之有效的方法,沒錯,這都是事實。在這方面,我覺得自己不如和我合作的那個女孩。方法是沒有統一的,但是對于具體的問題是有方法的,而且,對于現在我參與的項目中,開始最簡單的也就是要識别一個小球而已,比對小球的球心就可以了。研究可以用各種的辦法,但是,真正做項目,卻是要學會選擇真正簡單的行之有效的方法就可以了,用得好就是本事。另外還有一個插曲,當時,上網找雙目視覺的資料,看到一個女孩的叙述,說自己做的也是雙目視覺方面的工作,但是,那個女孩說,她感覺那上面主要的就是一些數值算法,但是,我還真的有些相信了,現在想想,其實,那個女孩的認識是錯誤的。我現在的認識是,主要的還是圖像處理方面的工作,不知道将來會不會有别的認識,但是現在的認識還隻是如此。至于,小車在球場中的定位問題,我想當時可能考慮得太早,不過當時在師兄的督促下,也推導了一下公式,幾經修改,最後,感覺也算是滿意了,可是,我的東西都亂放,是以,那份改好的文檔,除了給了師兄一份以外,自己可能就沒有留存了,隻是在郵箱中還有一份,可是這僅有的一份也感覺不是最後的版本了(在這其中有好多版本,都或多或少有錯誤)。小車的定位,當時也許是考慮得太早了,因為視覺方面的東西還沒有下來。

在這其中,我不能不提到我的好朋友,她當時知道我要做這個,幫我去聯系了一個做圖像處理的人(說是她的男朋友的好朋友),想讓我和他交流交流,可是,我和他沒有太多的聯系,想想自己走的彎路,也是自己不好問的結果。我要好好的感謝我的好朋友,我知道,我和她是互相擁有的,心靈相通,可是,我覺得自己對她沒有她對我好。

2。2004年8、9月份。由于項目中用的是usb攝像頭,沒有圖像采集卡,要進行圖像方面的處理,就需要自己捕捉視訊流,然後再對圖像進行處理。和我一起合作的女孩,其實已經作了一個用vfw實作的視訊捕捉的程式,做得相當不錯。于是,我問她要了源代碼,然後,也從中國學術期刊網上下了一些論文(因為發現介紹這種技術的書太少了),想要好好研究一下。後來突然看到一篇文章中寫道,vfw中的提供的函數庫就是已經封裝在windows作業系統上了,當時就突然想到,在wince下面可能都不能提供這方面的支援。在書店裡看到過一本講wince方面的書,當時随便翻了翻,裡面提到wince下面支援directshow,而directshow可以用來捕捉視訊流的。我覺得自己特别幸運,當我想學directshow的時候,正好有directshow方面的兩本書剛剛出版,在書店熱銷中。對于入門,中文書還是不錯的,能讓你有一個系統的概念。特别是,我當初對directshow一點了解都沒有的情況下。于是從微軟的網站上下了directX 9(當時也是剛出來的),開始學習用directshow進行視訊流的捕捉。主要參照了那本directshow的中文書和一本外文的電子文檔,也看了一下directshow的幫助文檔,參照裡面的例子,實作了視訊流的捕捉和儲存,并能将捕捉到的圖像儲存為bmp位圖的格式。現在想想,當初做這些花了挺長時間,其實,應該很快就能做出來的。不過,也在論壇上看到一個文章,說到了驅動的問題。在一般的windows平台下,驅動有兩種模型,一種是vfw,一種是wdm,其中,vfw是已經過時了的(我對驅動沒有太多的研究,不知道這樣說妥不妥),而現在的驅動一般都是符合wdm模型的。directshow有一種機制,能把符合wdm模型的驅動分裝成一個source filter,但是,沒有驅動是不可以的。這就存在一個問題,wince下是必須要有攝像頭的驅動的,才能用directshow。于是,大家就都開始找驅動,可是,最後的結果是wince下沒有現成的這款攝像頭的驅動的,可能唯一的辦法就是自己開發。這些都是後話。當時還是在學directshow,想法是在wince下開發雙目視覺,還是需要directshow的,隻要有了驅動,就可以了。而後來,當對wince下的驅動有了一些了解後,并詢問了網上的一個挺熱心的人(他做過wince下的驅動,也做過wdm模型的驅動),後知道,wdm模型驅動和wince下的驅動模型是不一樣的。具體為什麼不一樣,因為我對wdm驅動模型不了解,隻知道如果自己開發wince下的驅動,一般用的是流驅動模型。直到這個時候,我還對用directshow封裝開發好的驅動,然後再在wince下用directshow進行視訊流的捕捉,這一套方案,深信不疑。

要做一些實際的東西了,當我能用自己編寫的程式應用directshow技術,捕捉視訊流和把捕捉的圖像儲存後,我就打算做一下錄影機的标定了。雖然,directshow這個技術,我隻是涉及到一些皮毛,編寫的程式也很粗糙。關于錄影機的标定也是用的最簡單的方法,有一個棋盤格,然後,找棋盤格上的交點。現在想想,那裡面最主要的就是圖像處理的方法了。用到了彩色圖像的邊緣檢測;用大津法(OTSU)法自動求灰階圖像分割的門檻值,通過求得的門檻值,将圖像二值化;用形态學上的圖像的細化的方法,對二值圖像進行細化;通過進行hugh變換,求圖像中的直線,對橫線和縱線分别求,并把直線畫在原來的圖像和處理後的圖像上;求橫線和縱線的交點坐标,為此還要對橫線和縱線進行排序。在這裡主要是解方程組,為了求矩陣的逆,為友善采用了vc和matlab相連的方法,最後求得的圖像點的坐标也在原圖和變換後的圖像中表示了出來。在這裡說明一下,僅僅為了求矩陣的逆,我用了matlab和vc相連的方法,在當時看來,剛開始做的時候,想的是簡單一些,可是,卻是不明智的。因為,一點是用到的matlab部分太少,不值得,而當初,為了把參數傳給matlab我花了很長的時間,在網上查到的參數的傳遞順序不對,隻是自己慢慢試出來的。另一點是,其實用現成數值計算的求矩陣的逆的源代碼就可以了,而且還會簡單。作這個标定的程式,花了不少的時間,也是對圖像處理的算法等等都不熟悉。後來,和我合作的女孩直接用matlab的工具箱作标定,也作了實驗,驗證了标定的結果,肯定會比我做的效果好。也就是我做的這個,基本上就是屬于失敗的,除了自己在其中學到了一些圖像處理的方法,對簡單的标定有了一些感性的認識外,對這個項目沒有任何的幫助。要提一下,在圖像處理方面,由于我不好問,其實,自己在走,走了不少彎路。我不知道有角點檢測,這個也是前一段時間,導師讓所有進行雙目視覺研究的人都來開會,讨論雙目視覺方面的東西,然後,我才知道的。當時,一個老師示範了用OpenCV中的函數庫進行角點檢測的程式,感覺效果還真的不錯。而在我看來,簡單的錄影機标定,就是在那些角點的檢測上了,如果我能早知道就好了。有時候理論和實際是完全不同的,實際也是自己的動手的過程。标定中圖像處理的大體步驟,我是按一篇碩士論文中寫的做的,雖然有些方法用的不同,但是,我覺得自己用的方法,比他用得更好些。當時,他在論文中寫的是誤差很小,也列出了各種資料。不過,據我看來,可能誤差,不能太小的。

3。2004年10、11月。從十一放假後,我差不多就想要看看能不能有自己作驅動的希望了,當時,标定的程式雖然是出來了,但是具體的精度沒有細緻的驗證,隻是覺得精度不會高,因為從找到的圖像中的點就可以看出來,還是有些誤差的。并且,一起合作的女孩用的是标準的工具箱做标定,效果怎麼樣,都會比我做的好,我覺得對一個實際的項目來說,在做下去,是沒有意義的了。我曾對我以前的同學說,沒有驅動怎麼辦?她當時馬上說,自己做!後來,是以,我也就想看看能不能自己作驅動了。上各個論壇上看了,也找了些有關驅動方面的書,可是能找到的大部分都是WDM模型的。剛開始的時候,很迷茫,也下了XP的DDK(driver develop kit),但是還是不知道從什麼地方入手。有關介紹wince下的驅動開發的很少。不過後來不知道怎麼想的,就決定先看看wince下的驅動模型,還想到了要開發的是usb攝像頭的驅動,是以,應該再看看usb協定的。于是,我看了一個人翻譯的usb 1.0協定,也算是對usb協定有了些了解。我上biplip.com的論壇上問,在wince下編寫usb攝像頭的驅動有些什麼要求,版主給了我挺好的建議,在今天看來,從我現在的了解來看,也相當不錯的。他告訴我要看幫助文檔,這是真的。正如他所說的,不看幫助文檔是不行的,越是E文的,越要看,真的很感謝他。我也上了驅動開發網的wince論壇,那裡有一個熱心人,到後來,我問他問題,也就直接給他發信了,他也每回都很認真的回複了,他自己說做過wdm模型的驅動,也做過wince下的驅動,也就是他對我說wdm模型的驅動和wince下的驅動是不一樣的。他很熱心。我知道要作驅動必須對系統有比較深的了解,于是,開始看wince的幫助文檔,看如何定制平台,其實這是挺簡單的,如果從簡單的角度看的話,但是,也有些東西,沒有開發闆是不行的,這一部分,我做的也是很膚淺,不會通過改變系統檔案,來定制平台,由于沒有試驗過,是以所看的都是些紙上談兵,沒有實戰的經驗,是以,也就1、2個月的時間,到現在也就忘得差不多了,這樣想想,其實,學會做工作日記還是很重要的。到後來,我知道了在wince下面如果是使用者自己編寫的程式,一般都是流驅動模型的,對于usb裝置的驅動,隻要在上層實作10個流接口函數,在下層實作3個流接口函數,就可以了。真正和usb打交道的是系統會提供的幾個函數。通過調用這幾個函數,就能把資料取出來了。也看了一下系統提供的usb裝置驅動的例子,當時看的是列印機的。然後,一個師兄發給一個網址,說裡面有Linux的usb攝像頭驅動的例子。師兄還是師兄,看的會遠些的。後來,我也認識到要開發wince下的usb攝像頭的驅動,其實,還是可行的。在下層的3個函數的實作中,可以參照wince下提供的例子,而在上層的10個函數的實作中,可以看Linux驅動的例子。不過,由于種種原因,當我認識到這一點,打算好好做一下的時候,我就被迫放棄了。這次放棄,讓我受到了些許的打擊,也就是導緻我在這個學期剩下的日子中很堕落的原因之一吧,其實是自己的心态一直沒有調整過來。由于不作驅動了,那麼,就開始考慮當驅動做好之後應該如何用這個驅動了。因為當時驅動還沒有編出來,我就自己編寫了隻是用作試驗用的wince下驅動,裡面隻是有10個流接口的空函數而已,然後通過寫系統資料庫,用讀寫檔案的指令去擷取驅動提供的資料。當這個做完之後,我想由于是兩個攝像頭,雙目視覺,就是要擷取資料的同步的,于是又自己試驗了一下線程間同步,同時擷取資料。不過那個程式是簡單的,為了試驗,讓一個線程産生資料,另外還有擷取資料的線程。實驗結果也算是成功的。這樣,感覺上隻剩下真正圖像處理方面的東西了。另外現在想說一下,我當時認為的用directshow來在wince下面捕獲視訊流的想法,在那個時候已經意識到是不可以的了。我在自己定制的平台上,用directshow确實能播放mp3,但是播放不了視訊流,然後,還突然意識到,其實驅動是自己寫的,那麼就可以直接獲得驅動中的資料了,沒有必要自己再繞一個大圈子。我後來對曾經的男朋友談起這個,他說,我是有寬敞的大道不走,卻去自己走小道,确實如此。我繞了這麼大個圈子,然後又回到了起點。另外還要提一下,那個最後作驅動的男生,不管他做得怎麼樣,但是,有些佩服他的鑽勁。不過,他也隐瞞了一個事實,驅動中最主要的還是控制,至少在攝像頭中是如此,現在他也隻是得到了攝像頭的資料而已,當然也是很不錯的了,但是,在一個論壇上說的一句話讓我現在記憶仍然深刻,那就是得到資料隻是工作的三分之一,剩下的大部分的工作在對攝像頭的控制方面。不過,如果讓他在這樣做下去,也是難為他了。因為,其實,現在他也不想做了,很明顯的。于是很糊塗,這兩個月就這樣過去了。看了一些系統方面的文章,了解了一下作業系統,PlatformBuilder,和usb協定,也就是這樣了。

4。2004年12月。這個月是屬于堕落的一個月。在這個月中,我做了一下圖像處理,看了一下圖像處理方面的書籍,也問了一個做圖像處理的師兄,師兄對我的問題給了很熱心的回答。他建議我先看看matlab的圖像處理,也介紹了一本圖像處理方面的書給我看,後來我弄到了這本書的電子版。師兄說得對,圖像處理方面的還是應該先看看matlab,學會了思想,看到了效果,然後再用vc程式設計實作也是可以的。後來為了圖像處理的友善,我做了一個模闆,以後做圖像處理,就可以直接用這個模闆了,隻需要改其中的很小的一部分。上個星期,做了一個filter,用在directshow上面的,很簡單,不過發現自己的想法很幼稚,這是後話。

最後,要謝謝所有幫助過我的人,謝謝!雖然我這個學期沒有做什麼工作。

繼續閱讀