2020年5月機器視覺工作階段性總結

終於有時間可以好好整理一下這一階段的學習和項目經歷了,寫此文章的目的是對自我的總結和針對下一階段的目標做計劃。

        從2019年10月份,開始深入接觸機器視覺這個行業,因爲本人有圖像處理、深度學習、c++的基礎,因此學習起來並不是很困難,主要使用的機器視覺軟件是halcon軟件,該軟件在機器視覺開發中輸入常用的軟件,而且算子豐富,界面開發友好,開發效率很高,因此選擇該軟件進行機器視覺的開發,這裏本人主要學習是先通過看一些視頻,然後熟悉一下halcon軟件,熟悉後就開始研究halcon的自帶例程,然後結合項目進行設計算法,當然這裏說起來很簡單的,但是我是系統的對halcon有所理解後纔開始開發的。在開發的過程中遇到了很多問題,如相機的sdk開發、運動板卡的開發、界面QT的開發、和機械手的標定、3D視覺系統的搭建、點雲的處理以及通信、最後的視覺算法的優化和移植。整個過程學到了很多的知識,以前只是對算法有所瞭解,但是不知道有啥用,通過這個幾個項目對算法有了更深的的理解,尤其視覺的方面的算法,例如相機標定的本質、機械手標定的本質、3D系統的搭建的原理和需要注意的事項等等都有了很深的認識和理解。下面簡單的介紹一下,開發中間遇到的難點以及如何解決的。

        首先介紹一下機器視覺的開發流程:這裏參考了一篇文章,並加入了一點自己的理解,如下:

總體項目流程:

需求分析: 

      一個項目主要包含

  1. 定位(①Blob分析(主要包括二值化、形態學處理、特徵選擇,受光照影響較大)、②模板匹配)、識別,包括二維和三維
  2. 缺陷檢測
  3. OCR字符識別
  4. 測量類的項目這四個大方向包括二維和三維

方案設計:

       根據客戶應用的場合不同,選擇相應的鏡頭、相機、支架、光源及如何打光等


概要設計:

      軟件架構體系,vc++聯合halcon還是c#聯合halcon等,還有算法流程,怎麼通訊、怎麼識別等


詳細設計:

     每一個功能模塊怎麼做,包括圖像採集模塊、處理模塊、包括算法模塊,如何通訊等。通常將每個模塊形成一個動態庫,調用相應的接口函數即可,項目圖像採集調用SDK也是調用動態庫的過程。


常見的視覺項目中圖像處理框架:

     針對二維情況如下:

 

  1. 採集圖像
  2. 圖像預處理:濾波、二值化等處理以克服圖像干擾。
  3. 形態學或特徵處理(深度學習的話,後面還要加上訓練、識別)
  4. 顯示
  5. 調試
  6. 測試、修改
  7. 交互給客戶,讓客戶按照合同中的技術指標執行
  8. 維護
  9.   相機、鏡頭、光源的選型及打光也就是上面項目流程第二步方案設計的內容,這裏推薦一本書《工程光學》,講的比較詳細。

    三維情況是:

  1. 3d系統的搭建(結構光法、TOF法、雙目、DFF等)
  2. 獲取視差圖像,對其進行處理或者轉換成點雲
  3. 對視差圖像或者點雲進行進一步處理,如提取感興趣的輪廓或者點、對點雲進行處理或者濾波爲重建進行準備工作
  4. 得到目標後進行處理或者重建,如,引導機械手工作、抓取、檢測等等
  5. 顯示
  6. 調試
  7. 測試、修改
  8. 交互給客戶,讓客戶按照合同中的技術指標執行
  9. 維護

現在把我做的項目的困難進行總結:

     二維方面的算法就不細說了,無非就是一些圖像的增強、平滑、去噪、分割、特徵的提取等等內容即Blob分析,還有模板匹配等,難度不大,主要是應用方面比較靈活,需要了解開發的套路,這裏直接看官方例程就好了,在開發算法前,還需要對相機的選型、光源的選型進行確定,然後對相機進行畸變矯正,這裏大家需要理解矯正的本質原因是什麼,還有明白矯正的過程和評價標準。算法如果開發好的話,那下面就是對界面進行開發,可以使用QT也可以使用MFC,這裏界面開發需要注意的就是多線程問題,因爲視覺算法處理是需要時間的,而攝像機的幀率是很快的,因此需要開啓線程對相機的拍照和算法執行進行單獨的處理進行,尤其是線程的應用大家應該多注意死鎖問題,設計時需要考慮周到,以及發生異常如何處理等。然後開發相機的SDK,其實很簡單,配合界面開發的程序進行移植就好了,所謂的SDK開發,就是相機廠家提供的接口函數,一般官方會提供一個界面操作自己家的相機,同時也會提供界面的模板,還會提供大量的例程,大家只需要研究一下例子就可以移植了,如開啓相機,曝光量、曝光時間、增益、亮度等都可以通過接口函數進行設置的,這裏主要注意的是SDK輸出的默認圖片的格式,廠家不同,格式會不同, 還有就是需要把輸出格式的圖片轉換成halcon或者OpenCV可以處理的圖片格式,只有這樣,算法拿到圖片後纔可以處理。然後就是看看是否需要和機械手進行配合工作,如果需要機械手,則還需要對其進行標定,一般二維大多數使用的都是九點標定,其實不一定九個點,理解原理後你會發現,標定的目的就是得到一個仿射矩陣,通過矩陣把圖像的座標變換到機械手座標下的座標,然後讓機械手到達即可。有時候項目並不需要使用機械手,這時候可以使用運動板卡,運動板卡的開發和相機的SDK開發很類似,直接調用接口就可了,如果對這部分感興趣,也瞭解伺服電機等電器,完全自己可以組合一個簡易的機械手,因爲機械手的本質也是這些東西,當然精度方面不同的。如果項目使用運動板卡,這裏同樣也是需要進行標定的,和機械手一個道理,只是更麻煩點,因爲需要根據項目要求設計運動,然後對其進行標定,難度都不大。以上是進行定位、分揀、跟隨等項目。如果是測量的話,halcon提供了很多的算子,精度可以做到很高,大家研究例程就好了,這裏提醒大家一定要注意測量的世界平面的建立和目的,尤其是測量的類型。以上就是二維方面的學習總結,總的來說,難度不大,但是要求掌握的知識很多很雜,如果沒有軟硬件知識,可能會很難學習,但是不要着急,慢慢來吧,我大概學了一個半月就掌握了二維方面的開發。下面就簡單的介紹一下三維視覺的開發。

     對於是三維視覺,其難度相比於二維上升了不止一個層次,但是對於我來說都是水到渠成的事,難度還好,還能接受,主要原因是研究生期間研究了大量的人工智能算法知識,對其抽象知識已經適應了,各方面能力都得到了提高,因此學習起來覺得不是很難,但是因爲沒有這方面的經驗,因此也走了一些彎路,下面會一一分享。下面分享一個3D處理流程,是halcon官方提供的,大家查看一下幫助文檔,研究一下就知道了,如下:

      三維視覺的開發 ,首選是你需要確定你選擇什麼樣的方式進行獲取3D信息,目前主流的幾種方法結構光法、雙目、多目、TOF、DFF等,通過這些方法獲取三維的視差圖像也就是深度信息,拿到深度視差後可以轉換爲點雲,然後在對點雲進行處理或者獲取模板,對點雲進行處理後,提取到感興趣的輪廓或者點或者位姿,然後通過標定傳給機械手,使其工作即可。首先對於3D信息的獲取,我實現了兩種方式,一種是結構光法即基於激光三角的3D信息獲取系統,原理不說了,大家看論文把,不難理解都是基於簡單的幾何知識。從上圖可以看看,基於激光三角的可以直接獲取x,y,z的深度圖片,進而可以轉換爲點雲的3D模型,另外一種是雙目立體視覺,該模型可以直接獲取視差圖像,然後轉換爲點雲模型,同理還有其他的方法,這樣這是3D視覺的前提,即獲取點雲數據,然後就是進行處理,有融合、匹配、切割、配準等等操作,很多和二維的算法很類似,因此學習時要多思考以前學過的東西。

    在搭建的過程中,遇到了很多問題,如在搭建激光三角時,與機械手進行聯合標定時,老是出問題,當時對機械手還不是很瞭解,因此一直以爲是視覺的原因,嘗試了幾次發現不是視覺的原因是機械手那邊沒搞清楚,我們知道機械手的表示方法是座標加歐拉角,但是歐拉角又分很多種形式,而我因爲不知道這個知識點,一直以爲都是x,y,z,所以標定的時候就按照這樣標定,結果可想而知,怎麼解決的呢?當時負責機械手的同事對這方面也不懂,沒辦法只有我來上了,然後研究了官方的手冊,發現了歐拉角的表示方法這個問題,然後分析了halcon的代碼,改了一下,然後進行標定,正確運行,由此可以發現,這個問題出現的本質原因在於我和同事對這方面都沒有經驗,導致走彎路,這次解決後,以後再使用機械手注意一下就好了,這就是經驗。還有一個問題就是在二維平面中,我要提取圓的軌跡,然後讓機械手跟隨,但是大家都知道,如果相機鏡頭和被測物並不是完全垂直,那麼拍到的照片提取的圓他不是一個圓,他是一個橢圓,機械手跟隨也是橢圓。我的項目中就遇到這個問題,百度發現可以通過投影變換進行解決,我就研究了投影變換,這個知識點很難,沒辦法需要解決,慢慢也就理解了,但是halcon官方給的例子和網上的例子大多數都是基於4點法進行糾正的,而我的圓無法使用4點法進行糾正,所以在這裏耽誤時間了,因爲沒有人可以問,只能自己研究,耽誤了很長時間,期間接着做其他項目,同時研究這個難點,在研究的過程中,halcon其實是提供了方法的,只是他不是針對這個領域,針對的測量的領域,大家都知道,在測量領域,如果相機鏡頭和測量對象不垂直,直接測量肯定是不準的,因此需要矯正,而halcon的人性化就體現了,提供了算子,把圖像轉換爲世界平面,這個平面無相機畸變和透視畸變,也就是說,通過這個算子就可以把相機畸變矯正同時也把透視畸變矯正,透視畸變矯正就是把圖像變換爲嚴格垂直鏡頭。因此變換到測量的世界平面進行測量精確度可以保證,基與此,我把他直接應用到我的問題上,問題完美解決,同時從這裏我學到了,對於不規則的圖片進行透視畸變,先提取二維圖像的位姿,通過位姿進行校正。從上面的解決問題可以發現,如果你遇到了問題,千萬不要着急,別人肯定遇到過,只是你還不知道解決的方法,剩下的就是帶着問題去學習就好了,這就是有工作經驗的好處,,,,,。

       以上就是我最近幾個月的學習總結和感想,當然過程肯定比我說的更坎坷,但是堅持下去,一段時間過後你會成長很快,目前三維方面的視覺還需要繼續深入,尤其是精度方面的需要進一步學習和提高,下面計劃一下後面幾個月的目標。

      目前二維方面的算法應用已經沒問題了,例如尺寸的測量、OCR的識別定位、匹配定位等項目都可以做了,而三維方面需要繼續深入,目前在看幾本書,理解一下理論知識,如《機器視覺》、《機器人視覺測量與控制》以及《視覺測量與方法》,其實這幾本書講的都差不多,好好理解一下。這幾本書看完後開始看點雲處理方面的書籍以及學習OpenCV和OpenGL兩個開源庫,然後深入研究點雲的處理的方法和應用庫PCL,然後在接觸SLAM技術。當然這個期間會不停的做項目積累經驗,遇到問題解決問題。這些實現估計半年左右應該可以完成。今天就到這裏。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章