原標題:基於激光投影技術的虛擬鍵盤(軟件篇)

今天給大家帶來的免費開源項目是:基於激光投影技術的虛擬鍵盤

上篇文章,已經介紹了硬件篇~(附上硬件篇鏈接),接下來給大家簡單介紹下程序部分。

直接看圖,看了就明白了!(鍵盤運行視頻在文末)

沒錯,就是這麼炫酷!

更加酷的是,這套方案,全部免費開源,免費!(源碼+論文+電路)

軟件部分的開發使用微軟公司推出的集成開發環境Visual Studio 2010,Visual Studio 2010集成了Visual C++,Visual C#,Visual Basic,Visual F#,Visual J++編譯環境,Visual Studio是Windows平臺上最受歡迎的編程環境。

OpenCV是開源的視覺庫,提供了C語言庫也有對應的JAVA語言庫,以及在Linux平臺下的語言庫最新的庫中也推出了Android平臺庫,在Visual Studio中,只有在工程的屬性頁中包含OpenCV的各個庫,即把對應的.lib文件包含進來,以及一些宏的引用的聲明,就可以直接調用庫裏所有的函數。

爲了把裝置做的小一點,所以採用了150°的廣角鏡頭,可以大大縮小裝置的尺寸,所拍攝出的圖片是會有失真的,所以在實際操作中必須要把失真的圖片校正,不然在後面的鍵盤的線性劃分時會有線性誤差,而導致整個鍵盤定位不正確,要通過一定程序算法來校正攝像頭拍攝出的曲面失真圖片,圖形校正採用了張正友的平面棋盤格圖形校正算法,爲了得到攝像頭的物理參數,使用Matlab的相機校正工具Camera Calibration Toolbox。

Matlab中的Camera Calibration Toolbox做成了一個GUI界面(圖4.3-1),不需要太多的編程就只要操作對應的UI界面和適當的鍵入參數,就可以實現攝像頭的校正,最終得到校正參數。

雖然用Camera Calibration Toolbox只要3張不同角度拍攝照片就可以標定好攝像頭,但在本設計中使用了9張用待標定攝像頭不同角度拍攝的照片,一張一張的進行處理,直到處理完所有的照片,然後進行誤差分析讓所有的誤差儘可能的均勻分佈,最後進行計算後,就會得到最後的校正參數,把最後到的參數代入到OpenCV的特定算法中,實時運算就可以實時校正失真的圖片,從而使之線性化,方便在後面的座標定位,以及目標的定位和按鍵的映射不出現非線性誤差。

標定攝像頭時,用於標定的照片要一張張的處理,但是每一張的處理都影響整個標定的好壞,使用每一張圖片標定時,必須要保證其正確嚴格控制其標定誤差,在標定過程中必須不斷的嘗試猜想值,使紅色十字架儘可能的分佈在棋盤格的各個角點上,如果不在角點上必須的不斷的嘗試,直至靠近所有的角點才能處理下一張校正圖片。

完成了所有圖片的標定之後,之後不斷的微調部分誤差較大的圖的校正值,使之誤差儘可能的集中,如果不控制整個誤差的分佈的話會影響整個參數的精度,必須通過微調部分誤差較大的圖的校正值,控制那些離散性較大的值,使誤差儘可能的均勻分佈,完成了這些之後就可以導出校正後的參數了

當然也可以導出校正圖片在空間排列的3D重建示意圖,通過這個3D示意圖可以對比圖片在校正拍攝前是否和自己設定的位置一樣。

同樣也可以導出對應的鏡頭畸變向量圖,這個圖反映了標定鏡頭各個方向畸變的向量趨勢圖。

最後導出標定後的參數導出的參數包括了內參數,畸變係數,焦距等關鍵參數。

把導出的標定參數放入xml文件,然後用cvLoad就可以讀入OpenCV了,然後通過內部相關的函數調用參數值,就可以實現失真圖片的校正了。

爲了驗證標定的參數是否正確把參數代入Matlab進行圖片校正看看是否達到預期效果如果達到預期效果就說明參數正確否則就還得重新校正。

如圖4.2-9所示,校正後的圖片較校正前的圖片明顯的變化,並且校正後的圖片的棋盤格基本上是真正意義上的正方形了,說明校正的參數是正確的。

使用Visual Studio,通過OpenCV庫對攝像頭數據的讀取和算法實現,使用cvCapture- FromCAM函數和cvSetCaptureProperty就可以直接連接到PC端的攝像頭,通過這兩個基本函數就可以很方便的讀取攝像頭,引用OpenCV庫函數直接跳過了相關的硬件驅動的開發和調試,極大的加快和方便了軟件開發。

到圖片後其實是彩色的圖片,但在本系統設計張感興趣的只是亮光點,和相關的顏色信號無關,所以必須把圖片二值化,以方便後面算法的實現,當然爲了進一步提高後面定位的精確性,所以在圖片二值化前可以使用cvThreshold 對單通道圖片數據應用固定閾值操作。該函數的典型應用是對灰度圖像進行閾值操作,得到二值圖像同時取得噪聲,列如濾掉很小或者很大的圖形點。

得到二值化圖像後,接下來要做的就是查找所有興趣點的輪廓,OpenCV裏的findContours是輪廓檢測函數之一,這個函數可以使用多邊形來近似表示一個輪廓其次,多邊形逼近的目的是爲了減少輪廓的頂點數目。但多邊形逼近的結果依然是一個輪廓,只是這個輪廓相對要粗曠一些。如果要使得查找的輪廓平滑一點可以使用approxPolyDP函數對該多邊形曲線做適當近似,如果要畫出查找到的輪廓的話,就可以配合使用drawContours函數,使用函數boundingRect,還可以得到輪廓的外包絡矩形。定位包絡矩形的中心點在圖片中的座標,然後就可以檢測到手指的位置,然後可以投射到鍵盤對應的位置。

找到興趣點的輪廓,定位到對應興趣點在圖片中的位置後,接下來的就是映射鍵盤了,雖然鏡頭是有線性失真的,但是通過一定的算法校正後,還是能保持線性的,所以只要把圖片比例化之後,然後劃分按鍵位置的座標,就可以直接映射到對應的按鍵位置了。

由於篇幅原因,軟件設計就介紹到這裏~後面還有整機調試篇,有待更新~可以關注我【張巧龍】,或者是我的公衆號【大魚機器人】

————————————————————

其實程序設計還有很多細節沒有講清,無妨。我有論文!上面有更詳細的論述和製作過程。然後免費開源(論文+代碼+電路)所有的資料!

附上原帖:(資料獲取方式),關注微信公衆號「大魚機器人」 後臺回覆:虛擬鍵盤

下面是一個簡單的運行視頻~

https://www.zhihu.com/video/1021478543557001216

——————————————————————

最後發個車~自己做了個公衆號【大魚機器人】,我會在上面分享一些學習資料、生活分享,需要的可以關注,願者上鉤。嘻嘻。

這裏不僅僅有免費資料,省去了你找資料的麻煩,還有許多免費開源項目~(基於體感仿生的手勢機器人、自動跟隨平衡機器人、虛擬鐳射鍵盤、mini全向輪移動機器人等等)

5T資源大放送!包括但不限於:C/C++,Linux,Python,Java,PHP,人工智能,PCB、FPGA、DSP、labview、單片機、等等!在公衆號內回覆「更多資源」,即可免費獲取,期待你的關注~

最後再放幾個~

查看原文 >>
相關文章