注釋:
1、書名:Mastering OpenCV with Practical Computer Vision Projects
2、章節:Chapter 3:Marker-less Augmented Reality
3、書中源代碼的最新更新可以參考網址:https://github.com/MasteringOpenCV/code
這是一個小主求學的小故事,簡單說一下:從16年6月到17年6月,本人一直在研究書上的代碼,沒有功勞卻有苦勞,所以在這里絮絮叨叨兩三句。因為硬性要求,小主目標是實現DIY的AR平台,但是目前對項目尚有一大堆問題,困惑到現在,總結任重而道遠。這里為一年的時間的勞苦功少總結一下學習匯報給自己。
這是對增強現實的簡單認識了,基於無標記識別的增強現實實現流程,並不依托網絡平台。要將這個增強現實的實現流程小主思路並不是特別清晰,因為只知皮表,不懂得摸骨的精髓。相信來查看這個的多數是有些了解的,那么這個作為科普來說了。
1,攝像機圖片的采集,我們用opencv的庫函數很方便調用:
VideoCapture capture(0); Mat capImg; capture>>capImg;
VideoCapture使我們采集攝像頭的照片傳給了capImg,從這里開始了。
2,圖像的預處理比較少,會用到圖像的灰度化處理,或者改變圖像的尺寸大小。
cvtColor(Img,Img_gray,COLOR_BGR2GRAY); //把Img灰度化為Img_gray;
3,特征點檢測,我們可以用到的有FAST算子,ORB算子,SIFT算子,SURF算子,等等。小主沒有去實現過,按自己的理解來點說一二:
這個項目里面用到的是ORB算子,而ORB是基於FAST的改進,那么原理同出一轍,在一個Bresenham圓上的像素點,比較一周的16個像素的灰度值,從某點出發,如果有連續的9個點像素灰度值大於或小於圓心的灰度值,那么就把它作為檢測出來的候選特征點保存,隨着特征點的檢測,我們便也確定了它的坐標(x,y);
4、特征點描述,同樣的特征點描述算子也有很多,有配套的檢測方法,也有單獨的,那么如:BERIF描述符,ORB描述符,SIFT描述符,SURF描述符。描述符的理念是對特征點的增強,使點的范圍擴展到一定區域,讓更大的區域里的信息來表征這個單單又小小的特征點。
同樣的跟項目相關,這里使用ORB描述符,而ORB再次基於BERIF描述符做出改進,那么來說吧。在特征點的周圍選定一定的區域,采用以下五種方式的一種對區域內進行隨機選擇點對(x,y),這樣比較如圖中短線兩端兩點的灰度值大小,以x>y為1,x<y為0,比較得出一組由256位01二進制數組成的數值串。在計算機中以8位為一字節存儲為32個十進制數表示某一個特征點。
如上圖,我們可以看到對檢測到的30個特征點進行ORB描述符計算,得到的每個特征點由32維向量表示。
5、特征點匹配
從書本上和網上查閱情況來看,匹配的數學依據有兩種,1是蠻力匹配,2是快速近似最近鄰算法(FLANN)匹配。而項目中使用的是(蠻力匹配吧),由特征點描述符和待測的圖像的特征點描述符進行歐氏距離計算,(聽同學跟我說用哪一種距離並沒有多少區別,現在還沒驗證),進而判定檢測出來的特征點匹配情況,距離小的為匹配點對。
匹配的效果並不好,小主對這種結果左右為難,食之無味,棄之可惜。沒找到更好的來代替,由於SURF和SIFT有專利保護,也沒有怎么參考。因為還是想實現整個過程為妙,改進的機會和時間總是有的。
6、匹配的優化
在學習過程中,查閱的FLANN算法對匹配點對的優化效果還是客觀的,可是小主不知道這個算法在特征點匹配過程中起着什么作用。大致體會是一個聚類算法,把接近的描述符分到一組里面,不斷分組如同二叉樹一樣,從上到下的進行索引,索引到子節點便是最近的吧?還有就是參數調試都是針對一個描述符集,感覺就是訓練器一樣把一組數據進行提前分類,但是如何做到排除不匹配某某兩點。
這里給出項目里面的匹配優化結果,當然這里的優化還是用了RANSAC算法,對離群值進一步刪除。
小主這里對它們望洋興嘆一番。基礎矩陣的校正,這里是我的坎了,匹配優化的算法封裝的很好,而數學算法模型又純純的數學,小主才疏學淺看着數學並沒有聯系到這些點吶,距離吶。
7、來接着說三維注冊,這里小主分析里面的注冊關鍵在於對攝像頭參數的計算和匹配優化好的點對進行單應性矩陣的計算。有這兩者,三維注冊已經大致完成。在項目中,攝像頭的參數是事先計算出來的,這個在opencv里面有棋盤模板的檢測,是張正友標定方法。而單應性矩陣的計算在項目中是這樣進行的,在優化后的匹配點對中挑選幾個進行計算,在opencv中使用的是findHomography函數,兩步走,一步直接計算得到單應性粗糙矩陣,二步對圖像進行透視變換扭曲再次測得一個透視的單應性矩陣和上一步粗糙矩陣相乘得到精確的單應性矩陣。單應性矩陣可以讓運算出一張圖片在另一幅圖上的位置,這也是空間坐標的確定。
8、其它的來說,便是一個虛實結合的過程,把建好的三維模型准確的顯示出來。這個可以通過OpenGL來繪制模型,在小主沒搞清前面的情況下,盲人摸象的過程中,了解到三維模型的繪制需要對三維建模軟件導出來的模型文件要進行解析,解析出里面的頂點數據,面數據,法線數據等,之后依照OpenGL的狀態機讀入模型數據,便可以顯示了。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
到此為止,小主把對增強現實的實現流程模糊的撥弄了一遍。而小主這里也要把自己的問題列出來,不論結果會怎樣,這是我接下來的任務00、
1、FLANN算法對特征描述符如何聚類和快速近似最近鄰檢測;
2、RANSAC算法對匹配的特征點對的離群值刪除又是一個什么機理;
3、項目的邏輯是清晰的,而小主是個菜鳥,一年前沒學過C++,OpenCV,OpenGL這些東西,而現在也只是皮毛,看代碼一年,總覺得對里面的參數一頭霧水,簡直不能自理,不能自理的最終結果是不能改動代碼為自己所用。在解決完上面兩個問題,那么小主下一個改動的地方應該是,把讀入的一張圖片調整為多組圖片的讀入,然后比照着多對多的匹配,如何建立好模板(每組圖片的特征點和特征描述符),然后拿動態攝像頭采集的圖片信息和模板上的每組圖片進行配對檢測,這樣時間上會不會很長吶?
真希望自己可以按照自己的意願來實現一些想法,踩在AR的跳板上,做一些好玩的事情。可是小主對明天有憂患,最進兩三年都是充滿憂患。可是活着總有問題,活着總是解決問題的,這是小豬對生活的看法,小豬是熱愛生活的一個人,繽紛的世界里,向往着獵奇與思無邪無所顧忌。
最新功能實現如圖:
自己寫過博客后,慢慢發現應該尊重別人的技術分享,所以以后寫文章時,應該首先列出參考博文,以后注意。后幾篇介紹了代碼的邏輯部分,並且參考了大牛們的博文對里面用到的算法做了簡述。
書中的代碼加了中文注釋,並整合到了一起,但是效果不佳。第二個直接添加了別人讀取obj格式模型的代碼,沒有紋理。
http://download.csdn.net/download/u013094783/10026155?web=web